一.TCP(Transmission Control Protocol 传输控制协议)协议
1.TCP协议概述:
TCP是一种可靠的,面向连接的,端对端的网络协议。
TCP/IP通信协议是一种可靠的网络协议,它在通信的两端各建立一个Socket,从而在通信的两端之间形成网络虚拟链路。一旦建立了虚拟的网络链路,两端的程序就可以通过虚拟链路进行通信。
TCP协议使用重发机制-当一个通信实体发送一个消息给另一个通信实体后,需要收到另一个通信实体的确认信息,如果没有收到确认信息,则会再次重发刚才发送的信息,因此通过这种重发机制,TCP协议向应用程序提供了可靠的通信连接。
2.TCP协议如何建立连接:
TCP协议通过“三次握手”建立连接,当主动方发出SYN连接请求后,等待对方回答SYN+ACK,并最终对对方的 SYN 执行 ACK 确认,这种建立连接的方法可以防止产生错误的连接。
"三次握手"过程如下:
1.客户端发送SYN(SEQ=x)报文给服务器端,进入SYN_SEND状态
2.服务器端收到SYN报文,回应一个SYN (SEQ=y)ACK(ACK=x+1)报文,进入SYN_RECV状态
3.客户端收到服务器端的SYN报文,回应一个ACK(ACK=y+1)报文,进入Established状态
三次握手完成,TCP客户端和服务器端成功地建立连接,可以开始传输数据了。
3.服务器端Socket
Java中接收其他通信实体连接请求的类是ServerSocket,ServerSocket对象用于监听来自客户端的Socket连接,如果没有连接,它将一直处于等待状态。方法如下:
Socket accept():如果收到客户端的连接请求,该方法将返回一个与客户端对应的Socket
构造方法:ServerSocket ss = new ServerSocket(8000); //8000为端口号,未指定IP,默认绑定本机IP
设置超时:
连接,读取操作超过合理时间后,系统判定为操作失败,主要作用是避免执行网络连接,读取服务器数据的进程一直阻塞。
setSoTimeout(time); //time为超时时间
Socket s = new Socket("127.0.0.1",8000);
s.setSoTimeout(10000);
4.客户端Socket
客户端通常使用Socket来连接到指定服务器,Socket有下面两个构造方法
Socket(InetAddress/String remoteAddress,int port) //较为简便,常用
Socket(InetAddress/String remoteAddress,int port,InetAddress localAddr,int localPort)
//这个构造器不仅指定远程主机IP和端口,还指定了本地IP和端口,适用于本机主机有多个IP的情况
Socket s = new Socket("127.0.0.1",8000);
5.建立连接后的数据通信
客户端,服务器端产生对应的Socket之后,连接便已建立,程序无须再区分服务器端和客户端,而是通过各自的Socket进行通信,Socket提供了输入流和输出流来发送和接受数据:
InputStream getInputStream() 返回该Socket对应的输入流,让程序通过该输入流从Socket中取出数据
OutputStream getOutputStream() 返回该Socket对应的输出流,让程序通过该输出流向Socket输出数据
二:UDP(User Datagram Protocol)协议
1.UDP概述:
UDP即用户数据报协议,它是一种不可靠的,面向非连接的协议。
面向非连接指的是在正式通信前不必与对方先建立连接,不管对方状态就直接发送,至于对方是否可以收到这些数据内容,UDP协议无法控制,所以说它是一种不可靠的协议。
UDP协议的主要作用是完成网络数据流和数据报之间的转换--在信息的发送端,UDP协议将网络数据流封装成数据报,然后将数据报发送出去;在信息的接收端,UDP协议将数据报转换成实际数据内容。
2.TCP协议和UDP协议的对比:
TCP协议:可靠,传输大小无限制,但是需要连接建立时间,差错控制开销大
UDP协议:不可靠,差错控制开销小,传输大小限制在64KB以下,不需要建立连接,比较高效
3.数据通信
DatagramSocket:代表UDP协议的Socket,相当于码头,只用于接收和发送数据报
DatagramPacket:代表数据报,相当于集装箱
DatagramSocket的3个构造方法:
DatagramSocket();
DatagramSocket(int port);
DatagramSocket(int port , InetAddress laddr);
创建完DatagramSocket对象后使用如下两个方法接收和发送数据
receive(DatagramPacket p): 从该DatagramSocket中接收数据
send(DatagramPacket p): 从该DatagramSocket对象向外发送数据报
DatagramPacket的构造方法
接收数据的一端应该使用的: DatagramPacket(byte[] buf , int length)
DatagramPacket(byte[] buf , int offset , int length)
发送数据的一端应该使用的: DatagramPacket(byte[] buf,int length,InetAddress addr,int port)
DatagramPacket(byte[] buf , int offset , int length,InetAddress addr,int port)