网络编程:TCP与UDP的区别
TCP/IP编程
使用TCP/IP的套接字(Socket)进行通信
服务器程序将一个套接字绑定到一个特定的端口,并通过此套接字等待和监听客户端到端口的连接请求
客户端程序根据服务器程序所在的主机名和端口发出连接请求
视同ServerSocket和Socket实现服务器端和客户端的Socket通信
我们以客户端发送数据服务器端接收数据为例看看整个操作流程
服务端
//服务器端接收数据 public class Server { public static void main(String[] args) { try { //创建服务端套接字 ServerSocket serverSocket = new ServerSocket(9999); //监听客户端请求 Socket socket = serverSocket.accept(); //获取Socket的输入对象 InputStream inputStream = socket.getInputStream(); byte[] car = new byte[1024]; int length = 0; //输出对象 OutputStream outputStream = new FileOutputStream("C:/Java_Tools/temp"); while((length=inputStream.read(car))!=-1){ outputStream.write(car,0,length); } outputStream.flush(); outputStream.close(); inputStream.close(); socket.close(); serverSocket.close(); } catch (Exception e) { e.printStackTrace(); } } }
客户端
//客户端发送数据 public class Client { public static void main(String[] args) { try { Socket socket = new Socket("127.0.0.1",9999); //向服务器端发送数据 OutputStream outputStream = socket.getOutputStream(); InputStream inputStream = new FileInputStream("C:/Java_Tools/log.log"); byte[] car = new byte[1024]; int length = 0; while((length=inputStream.read(car))!=-1){ outputStream.write(car,0,length); } outputStream.flush(); outputStream.close(); inputStream.close(); socket.close(); } catch (Exception e) { e.printStackTrace(); } } }
结论:由上过程可知,TCP/IP编程在创建socket时就已经建立了连接,固定了不可更改,只能是点到点的传输
UDP编程
UDP是用户数据报协议,基于UDP的Socket编程时一种非连接的Socket通信,它提供的是无连接、不可靠信息传送服务
DatagramSocket:用来发送和接受数据包的套接字
DatagramPacket:表示数据包
客户端:
public class Client { public static void main(String[] args) { try { DatagramSocket socket = new DatagramSocket(9999); byte[] data = "来自客户端的问候".getBytes(); SocketAddress address = new InetSocketAddress("127.0.0.1",8888); DatagramPacket packet = new DatagramPacket(data, data.length, address); socket.send(packet); socket.close(); } catch (Exception e) { e.printStackTrace(); } } }
服务端:
public class Server { public static void main(String[] args) { try { DatagramSocket socket = new DatagramSocket(8888); byte[] car = new byte[1024]; DatagramPacket packet = new DatagramPacket(car,car.length); socket.receive(packet); int length = packet.getLength(); System.out.println(new String(car,0,length)); socket.close(); } catch (Exception e) { e.printStackTrace(); } } }
结论:UDP是先指定一个服务端端口号,然后通过数据包来确定连接,从而可以实现一对一、一对多、多对一、多对多的交互通信
两者比较:
1、TCP面向连接,发送数据前要先建立连接;UDP是无连接的,发送数据前不需要建立连接
2、TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,不保证可靠交付;
3、UDP有较好的实时性,效率比TCP高,适用于对高速传输和实时性较高的通信或广播通信
4、每一条TCP连接只能是点到点;UDP支持一对一、一对多、多对一、多对多的交互通信