UDP-如何实现客户端与服务器端的通信(一对一、一对多、多对一、多对多之间的通信)

Java中提供了DatagramSocket来实现这个功能

1.服务器端的程序
  • 创建Socket,监听6666端口
  • 读取来自客户端的"数据包",创建数据包(通过DatagramPacket实现数据包的创建)
  • 接收数据包
  • 从数据包中,读取数据(通过recieve()接收数据send()发送给数据)

代码如下:

java 复制代码
package com.ztt.udp.Demo01;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class UdpServer {
	public static void main(String[] args) {
		//创建Socket,监听6666端口
		try (DatagramSocket serverSocket = new DatagramSocket(6666)) {
			//读取来自客户端的数据包
			//创建数据包
			byte[] buff=new byte[1024];
			DatagramPacket packet=new DatagramPacket(buff,buff.length);
			
			//接收数据包
			serverSocket.receive(packet);
			System.out.println("读取完毕!");
			
			//从数据包中,读取数据
			byte[] data=packet.getData();
			String strFormClient=new String(data);
			System.out.println("来自客户端的信息:"+strFormClient);
			
			if("天王盖地虎".equals(strFormClient)) {
				packet.setData("宝塔镇河妖".getBytes());
			}else {
				packet.setData("哈哈哈哈哈哈哈".getBytes());
			}
			//反馈信息给客户端(发送数据包至客户端)
			serverSocket.send(packet);
			
		} catch (SocketException e) {
			
			e.printStackTrace();
		} catch (IOException e) {
			
			e.printStackTrace();
		}
	}

}
2.客户端的程序
  • 创建socket
  • 连接指定主机的端口(客户端使用**clientSocket.connect()**指定远程地址和端口)
  • 创建数据包
  • 发送数据包(通过recieve()接收数据send()发送给数据)

代码如下:

java 复制代码
package com.ztt.udp.Demo01;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;

public class UdpClient {
	public static void main(String[] args) {
		//创建socket
		try (DatagramSocket clientSocket = new DatagramSocket()) {
			//连接指定主机的端口
			clientSocket.connect(InetAddress.getByName("192.168.199.112"),6666);
			
			//创建数据包
			DatagramPacket packet=new DatagramPacket(new byte[1024],1024);
			packet.setData("甜甜是甜甜".getBytes());//将数据放入数据包
			
			//发送数据包
			clientSocket.send(packet);
			
			//等待接受反馈信息(等待接收来自服务端的数据包)
			clientSocket.receive(packet);
			byte[] data=packet.getData();
			String strFormClient=new String(data);
			System.out.println("来自服务端的信息:"+strFormClient);
		
		} catch (SocketException e) {
			
			e.printStackTrace();
		} catch (UnknownHostException e) {
			
			e.printStackTrace();
		} catch (IOException e) {
			
			e.printStackTrace();
		}
	}

}

总结:

  1. 使用UDP协议通信时,服务器和客户端双方无需建立连接;
  2. 服务器端用DatagramSocket(port)监听端口;
  3. 客户端使用DatagramSocket.connect()指定远程地址和端口;
  4. 双方通过receive()和send()读写数据;
  5. DatagramSocket没有IO流接口,数据被直接写入byte[]缓冲区;
相关推荐
我先测了22 分钟前
零第三方工具!Win10 自带磁盘管理给 C 盘扩容「纯官方」操作笔记
windows·笔记·扩容·c盘扩容
三品吉他手会点灯23 分钟前
STM32F103 学习笔记-21-串口通信(第2节)-STM32串口功能框图讲解
笔记·stm32·单片机·嵌入式硬件·学习
AI视觉网奇27 分钟前
nvidia 插件安装使用笔记
笔记·ue5
代码游侠1 小时前
应用——Web服务器项目代码解析
运维·服务器·开发语言·前端·笔记·html
Sirens.1 小时前
Java异常处理解析:从防御式编程到自定义异常类
java·开发语言·笔记·学习·github·javac
tjsoft1 小时前
多个阿里云卡顿处理笔记之-Storage Service占用1g内存
笔记·阿里云·卡顿·storage service
RaLi和夕1 小时前
硬件电路设计学习笔记4.MOS管
笔记·嵌入式硬件·学习
clorisqqq2 小时前
《人工智能现代方法(第四版)》笔记 启程
人工智能·笔记
海绵宝宝的月光宝盒2 小时前
01_SolidWorks加载Design library设计库
经验分享·笔记·其他·制造·学习方法
AwhiteV2 小时前
打破次元:Orbital Notes,让灵感在桌面边缘“卫星式”起航!时时刻刻捕捉你的灵感!
笔记