通信协议大概分五层。
分层优点: 不需要管具体实现,只需要做自己的事情。
分层标准:
OSI参考模型
TCP/IP参考模型
TCP/IP详解(了解网络底层的书)
IPV6的相关问题
TCP为可靠的因特网连接
UDP为不可靠的因特网连接
Socket的基本概念:
两个java应用程序可以通过一个双向的网络通信连接实现数据交换,这个双向链路的一端称为一个Socket。
Socket通常用来实现client—server连接。(CS模式,客户端服务器模式)
java.net包中定义两个类 Socket和ServerSocket,分别用来实现双向链接的client和server端。
建立连接时所需的寻址信息为远程计算机的IP地址和端口号(Port
number)
网络编程:Socket编程
ServerSocket为TCP上的服务器端口。
IP地址和端口号(Port number)
端口号表示应用程序的识别码
类似于IP 端口号为两个字节最多有65536个端口
一个应用程序可以应用多个端口号
注意一点:自己编程占用端口号时:尽量用1024以上的端口号,因为1024以下的端口系统有可能征用。
关于数据的传输使用流的概念。
流的东西在java.io.*包中。
在Socket端口上有个getInputStream()方法
注意:DataInputStream
类中的readUTF();方法也是阻塞式的方法。
ServerSocket的方法accept()也为阻塞式的。
由于readUTF方法为阻塞式的
则会产生如下问题:
当一个客户端调用服务器的时候进行通信调用readUTF()方法时,就会产生阻塞,其他的客户端就无法访问服务器。
在服务器中使用Socket 的getInetAddress获取客户端的端口号
CS之间的数据传输:使用流概念就是:OutPutStream和InPutStream
可以在各种流上添加相应的处理流。用来方便处理。
现在我们可以做一个简单的聊天程序。
作业。。。。。。。。。
小例子:
客户端:
import java.net.*;
public class TCPClient
{
public void main(String[] args) throws Exception
{
Socket cl = new Socket("127.0.0.1",6666);//有异常产生,127.0.0.1为本地IP地址。6666为端口号
}
}
public class TCPClient
{
public void main(String[] args) throws Exception
{
Socket cl = new Socket("127.0.0.1",6666);//有异常产生,127.0.0.1为本地IP地址。6666为端口号
}
}
服务器端:
import java.net.*;
public class TCPServer
{
public void main(String[] args) throws Exception
{
ServerSocket a=new ServerSocket(6666);//监听6666端口号 有异常产生,可以抛出。
while(true)//服务器端为死循环,一直循环等待客户端连接。
{
Socket s=a.accept();//在服务器上创建一个和客户端相连接的Socket端口,抛出IO异常。这时候只能接受一个客户端的连接,因为一个Acception只能接受一个客户端连接。
//Accept方法为阻塞式的方法。
System.out.println("连接结束");
}
}
}
public class TCPServer
{
public void main(String[] args) throws Exception
{
ServerSocket a=new ServerSocket(6666);//监听6666端口号 有异常产生,可以抛出。
while(true)//服务器端为死循环,一直循环等待客户端连接。
{
Socket s=a.accept();//在服务器上创建一个和客户端相连接的Socket端口,抛出IO异常。这时候只能接受一个客户端的连接,因为一个Acception只能接受一个客户端连接。
//Accept方法为阻塞式的方法。
System.out.println("连接结束");
}
}
}