UDP(User Datagram Protocol 用户数据报协议)
TCP(Transmission Control Protocol 传输控制协议)
UDP是一种非面向连接的传输协议,它的实现是通过向指定ip的指定端口发送一定字节长的数据包完成通信,UDP协议不会在意接收端有没有收到数据包,不对传输的数据包到达的顺序、能否到达指定地址做任何保证,因此是一种不可靠但速度很快的协议,通常用在即时通讯、网络即时视频传输等不太在意丢失个别数据包的情况下。
在java中,通过UDP协议进行通信是使用DatagramSocket对象来操作相关数据,用DatagramPacket对象来抽象表示数据包,DatagramSocket类的构造函数可以指定接收端所监听的端口或者指定发送端发送数据使用的端口,在发送端DatagramPacket类的构造函数可以接受一个已存在数据的字节数组并指定要发送到的主机名(IP地址)及其端口,然后用DatagramSocket对象的send()方法将此数据包发送到指定地址,在接收端DatagramPacket类的构造函数只指定一个字节数组用于存放数据,然后用DatagramSocket服务的receive()方法(此方法为接受数据包的阻塞式方法)将传来的数据包中的数据存入此字节数组中,(可用DatagramPacket中的getLength()方法获取传来的数据包中字节数组的长度用于接收端对数据的操作)。
TCP是一种面向连接的可靠的、基于字节流的传输层通信协议,TCP协议通过服务端和客户端的三次握手可以建立一个可靠的连接,连接建立后,在Java中就可以用io流技术来传输信息。
java中用于TCP协议的服务类有两个,一个是用于客户端的Socket类,一个是用于服务器端的ServerSocket类,ServerSocket服务的accept()方法可以返回一个Socket对象,通过此Socket对象可以用Socket类中的getInputStream()和getOutputStream()得到客户端的输出流和输入流(两端输入与输出逻辑对称),通过流对象可以实现客户端与服务器端的双向传输。
为了使服务器端可以同时处理多个客户端请求,可以通过多线程技术来实现,具体方法是在服务器端中建立死循环,通过ServerSocket服务的accept()方法(阻塞式方法)获得服务端Socket对象,通过将Socket对象传入实现了Runnable接口的类中建立新对象,将对客户端的回应代码封装入该类中的run()方法中,通过在死循环中的阻塞方法后建立新线程的方式,实现总有一个accept()方法处于阻塞状态中等待回应客户端的状态。