udp server client
package testUDP; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; public class UDPServer { public static final int PORT = 30000; // 定义每个数据报的最大大小为4K private static final int DATA_LEN = 4096; // 定义该服务器使用的DatagramSocket private DatagramSocket socket = null; // 定义接收网络数据的字节数组 byte[] inBuff = new byte[DATA_LEN]; // 以指定字节数组创建准备接受数据的DatagramPacket对象 private DatagramPacket inPacket = new DatagramPacket(inBuff, inBuff.length); // 定义一个用于发送的DatagramPacket对象 private DatagramPacket outPacket; // 定义一个字符串数组,服务器发送该数组的的元素 String[] books = new String[] { "轻量级J2EE企业应用实战", "基于J2EE的Ajax宝典", "Struts2权威指南", "ROR敏捷开发最佳实践" }; public void init() throws IOException { try { // 创建DatagramSocket对象 socket = new DatagramSocket(PORT); // 采用循环接受数据 for (int i = 0; i < 1000; i++) { // 读取Socket中的数据,读到的数据放在inPacket所封装的字节数组里。 socket.receive(inPacket); // 判断inPacket.getData()和inBuff是否是同一个数组 System.out.println(inBuff == inPacket.getData()); // 将接收到的内容转成字符串后输出 System.out.println(new String(inBuff, 0, inPacket.getLength())); // 从字符串数组中取出一个元素作为发送的数据 byte[] sendData = books[i % 4].getBytes(); // 以指定字节数组作为发送数据、以刚接受到的DatagramPacket的 // 源SocketAddress作为目标SocketAddress创建DatagramPacket. outPacket = new DatagramPacket(sendData, sendData.length, inPacket.getSocketAddress()); // 发送数据 socket.send(outPacket); } } // 使用finally块保证关闭资源 finally { if (socket != null) { socket.close(); } } } public static void main(String[] args) throws IOException { new UDPServer().init(); } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | package testUDP; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.util.Scanner; public class UDPClient { // 定义发送数据报的目的地 public static final int DEST_PORT = 30000 ; public static final String DEST_IP = "127.0.0.1" ; // 定义每个数据报的最大大小为4KB private static final int DATA_LEN = 4 * 4096 ; // 定义接收网络数据的字节数组 byte [] inBuff = new byte [DATA_LEN]; // 以指定的字节数组创建准备接收数据的DatagramPacket对象 private DatagramPacket inPacket = new DatagramPacket(inBuff , inBuff.length); // 定义一个用于发送的DatagramPacket对象 private DatagramPacket outPacket = null ; public void init() throws IOException { try ( // 创建一个客户端DatagramSocket,使用随机端口 DatagramSocket socket = new DatagramSocket()) { // 初始化发送用的DatagramSocket,它包含一个长度为0的字节数组 outPacket = new DatagramPacket( new byte [ 0 ] , 0 , InetAddress.getByName(DEST_IP) , DEST_PORT); // 创建键盘输入流 Scanner scan = new Scanner(System.in); // 不断地读取键盘输入 while (scan.hasNextLine()) { // 将键盘输入的一行字符串转换成字节数组 byte [] buff = scan.nextLine().getBytes(); // 设置发送用的DatagramPacket中的字节数据 outPacket.setData(buff); // 发送数据报 socket.send(outPacket); // 读取Socket中的数据,读到的数据放在inPacket所封装的字节数组中 socket.receive(inPacket); System.out.println( new String(inBuff , 0 , inPacket.getLength())); } } } public static void main(String[] args) throws IOException { new UDPClient().init(); } } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?