JAVA网络编程之UDP通信

2021-08-23 11:30:12 浏览数 (1)

文章目录

  • 概述
  • 一、TCP通信的实现原理
  • 二、代码

概述

UDP协议是一种对等通信的实现,发送方只需要接受方的IP(地址)和Port(端口),就可以直接向它发送数据,不需要线连接。每个程序都可以作为服务器,也可以作为客户端。UDP是一种无连接的传输协议,每个数据报的大小限定在64KB以内。数据报是一个在网络上发送的独立信息,它的到达。到达时间以及内容本身等都不能得到保证。这种传输方式是无序的,也不能确保绝对的安全可靠,但它很简单也具有较高的效率。 使用UDP协议进行数据传输是,需要将需要传输数据定义为数据报(DatagramPaket),在数据报中指明数据所要到达Socket(主机地址和端口号),然后再将数据报发送出去。实例化DatagramPacket时使用参数port和没有使用参数port的区别在与,提供port的一方可以让别人主动发送消息过来,而没有参数port的则会在发送消息时自动绑定一个本地没有使用的端口。在接收到发送的数据报(DatagramPaket)时,不仅可以获取数据,还可以获得发送方的IP和Port,这样就可以向发送方发送数据,因此,本质上二者是对等的。

一、TCP通信的实现原理

1、在接收端指定一个端口号来创建DatagramSocket,然后创建一个接收数据报(DatagramPaket),使用recevie方法等待发送方请求报文,这将阻塞服务器线程 2、在发送方创建一个DatagramSocket,使用接收方的IP和端口来创建发送数据报(DatagramPaket),使用send方法发送。现在接收方的recevie方法被唤醒,同时会将发送方的数据报内容填充到接收方的DatagramPaket中。 3、接收方从发送方的数据报中获得发送方的IP和端口,使用它们构造一个发送数据报,然后发送给发送方,这样就实现了发送方和接收方的通信 4、在通信完成后,在客服端和服务端中分别关闭Socket

二、代码

发送端:

代码语言:javascript复制
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class SendMessage {

	public static void main(String[] args) throws Exception {
		// 创建发送端Socket对象
		DatagramSocket sendSocket = new DatagramSocket();
		// 准备需要发送的数据
		String message = "hello";
		// 创建一个缓冲区
		byte[] messageByte = message.getBytes();
		// 获取缓冲区中数据的真实长度
		int messageLen = message.length();
		// InetAddress实例化获取本机通信地址
		InetAddress address = InetAddress.getLocalHost();
		// 设置通信端口号
		int port = 12345;
		// 打包数据
		DatagramPacket sendPacket = new DatagramPacket(messageByte, messageLen, address, port);
		// 发送数据
		sendSocket.send(sendPacket);
		// 发送端等待接收端成功接收信息后返回的回应
		// 创建一个缓冲区,容量尽量设置大一点因为不知道发送过来的信息有多大
		byte[] recevieByte = new byte[1024*10];
		int len = recevieByte.length;
		// 接收数据报
		DatagramPacket receivePacket = new DatagramPacket(recevieByte, len);
		// 接收数据
		sendSocket.receive(receivePacket);
		// 获取接收端发送过来的真实长度以及数据
		byte[] data = receivePacket.getData();
		int length = receivePacket.getLength();
		String receiveData = new String(data,0,length);
		// 获取发送者的IP
		address = receivePacket.getAddress();
		String ip = address.getHostAddress();
		System.out.println("接收来自:" ip "的数据,内容是:" receiveData);
		// 关闭资源
		sendSocket.close();	
	}
}

接收端:

代码语言:javascript复制
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class RecevieMessage {

	public static void main(String[] args) throws Exception {
		// 接收消息的端口(与发送端保持一致)
		int port = 12345;
		DatagramSocket recevieSocket = new DatagramSocket(port);
		// 设置缓冲区接收发过来的信息
		byte[] receiveByte = new byte[1024*10];
		int len = receiveByte.length;
		// 接收数据报
		DatagramPacket receviePacket = new DatagramPacket(receiveByte, len);
		// 接收数据
		recevieSocket.receive(receviePacket);
		// 获取实际接收到的数据及其大小
		byte[] data = receviePacket.getData();
		int length = receviePacket.getLength();
		String receiveData = new String(data,0,length);
		// 获取发送者的IP
		InetAddress address = receviePacket.getAddress();
		String ip = address.getHostAddress();
		System.out.println("接收来自:" ip "的数据,内容是:" receiveData);
		// 接收端接收到信息后发送一条确认接收的消息到发送端
		String message = "OK";
		byte[] messageByte = message.getBytes();
		int messageLength = message.length();
		// 从已收到的数据报中获取IP和port
		address = receviePacket.getAddress();
		int port1 = receviePacket.getPort();
		//构造新数据报
		DatagramPacket sendPacket = new DatagramPacket(messageByte, messageLength, address, port1);
		// 发送数据
		recevieSocket.send(sendPacket);
		// 关闭资源
		recevieSocket.close();
	}
}

0 人点赞