TCP与UDP区别

帅比萌擦擦* 提交于 2020-03-06 12:52:15

TCP

为了方便开发网络应用程序,美国伯克利大学在Unix上实现的一种应用程序访问网络的通信协议Socket,Socket的出现使程序员可以很方便的访问TCP/IP;

使用TCP/IP的套接字(Socket)进行通信:

  1. 服务器程序将一个套接字绑定到一个特定的端口,并通过此套接字等待和监听客户端到端口的连接请求;
  2. 客户端程序根据服务器程序所在的主机名和端口发出连接请求

以客户端向服务器端发送 11.jpg(下图) 为例:

客户端:

import java.io.FileInputStream;
import java.io.OutputStream;
import java.net.Socket;

public class Client {
	public static void main(String[] args) {
		try {
			//建立链接:指定server所在主机地址和对应的端口(绑定过程)
			Socket socket = new Socket("127.0.0.1", 9999);
			
			//使用IO技术将图片发送
			OutputStream outputStream = socket.getOutputStream();
			FileInputStream fileInputStream = new FileInputStream("D:\\11.jpg");
			byte [] car = new byte[1024];
			int length = 0;
			while((length = fileInputStream.read(car))!=-1) {
				outputStream.write(car, 0, length);
			}
			outputStream.flush();
			outputStream.close();
			fileInputStream.close();
			
			//传输结束,关闭链接
			socket.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

服务器端:

import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server {

	public static void main(String[] args) {
		try {
			//建立服务器接口(绑定过程)
			ServerSocket serverSocket = new ServerSocket(9999);
			//等待接收来自客户端(client)信息
			Socket socket = serverSocket.accept();
			
			//对接收到的图片进行处理在本地生成
			InputStream inputStream = socket.getInputStream();
			byte [] car = new byte[1024];
			int length = 0;
			FileOutputStream fileOutputStream = new FileOutputStream("D:\\22.jpg");
			while((length=inputStream.read(car))!=-1) {
				fileOutputStream.write(car, 0, length);
			}
			fileOutputStream.flush();
			fileOutputStream.close();
			inputStream.close();
			
			//操作结束,关闭链接
			serverSocket.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
}

我们可以看出,TCP 链接传输是需要在客户端和服务器端之间先建立链接,再传输数据;正因为如此,该方法传输数据准确率高,基本不会出现丢数据的情况,主要用来进行精准的数据传输;、

UDP

  • UDP是用户数据报协议,基于UDP的Socket编程是一种非连接的Socket通信,它提供的是无连接、不可靠信息传送服务。

  • DatagramSocket:用来发送接收数据包的套接字

  • DatagramPacket :表示数据包

步骤:
  1. 创建数据Socket,指定一个服务端端口号。
  2. 提供一个byte数组用于数据存储。
  3. 调用DatagramPacketreceive() 方法进行数据的接收;
  4. 调用DatagramPacketgetData()方法得到byte数组的数据;
  5. 释放资源。

客户端:

import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;

public class Client {
	public static void main(String[] args) {
		try {
			//新建套接字绑定端口
			DatagramSocket socket = new DatagramSocket(9999);

			//创建 包packet 存储需要的数据
			byte [] data = "来自客户端的问候".getBytes();
			InetSocketAddress address = new InetSocketAddress("127.0.0.1",8888);
			DatagramPacket packet = new DatagramPacket(data, data.length, address);

			//发送 packet包
			socket.send(packet);
			socket.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

服务器端

import java.net.DatagramPacket;
import java.net.DatagramSocket;

public class Server {

	public static void main(String[] args) {
		try {
			//新建套接字绑定端口
			DatagramSocket socket = new DatagramSocket(8888);
			
			//创建需要的 packet包 准备接收数据
			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();
		}
	}
}

Server 控制台输出结果:

我们发现使用 UDP 传输数据是不需要先建立链接的,因为目标主机和端口号会被存储在 packet包 中,socket 只会发送 packet包,根据 packet包 中的信息寻找客户端;因此,UDP 是可以一对多进行数据传输的,只需要将发给不同的主机或端口号存储在不同的 packet包 中发送即可。

注意:UDP 因为没有首先建立链接,因此 UDP 有一定的数据丢失率(其实并不高),但因为传输速度比 TCP 快,常用来传输一些图片、视频等即使丢了一点数据也不会影响使用的数据。

小结:TCP与UDP区别

  1. TCP面向连接,发送数据前要先建立连接;UDP是无连接的,发送数据前不需要建立连接;
  2. TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,不保证可靠交付;
  3. UDP有较好的实时性,效率比TCP高,适用于对高速传输和实时性较高的通信或广播通信;
  4. 每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信。
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!