网络编程 UDP
不用连接,需要指定对方地址!
UDP是没有客户端和服务端的概念。
★ UDP消息发送
1.创建一个发送端 UdpClientDemo01.java
package com.ckfuture; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; public class UdpClientDemo01 { public static void main(String[] args) throws Exception { //1.建立一个Socket DatagramSocket socket = new DatagramSocket(); //2.建立个包 String msg="你好啊,服务器!"; //发送给谁 InetAddress IP = InetAddress.getByName("127.0.0.1"); int port=9090; //数据,数据的起始,数据的长度,要发给谁 DatagramPacket packet = new DatagramPacket(msg.getBytes(), 0, msg.getBytes().length, IP, port); //3.发送包 socket.send(packet); //关闭资源 socket.close(); } }
2.创建一个接收端 UdpServerDemo01.java
package com.ckfuture; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.SocketException; public class UdpServerDemo01 { public static void main(String[] args) throws Exception { //1.开放端口 DatagramSocket socket = new DatagramSocket(9090); //2.接收数据包 byte[] buffer = new byte[1024]; DatagramPacket packet = new DatagramPacket(buffer, 0, buffer.length); socket.receive(packet); System.out.println(packet.getAddress().getHostAddress()); System.out.println(new String(packet.getData(),0,packet.getLength())); //关闭资源 socket.close(); } }
3.依次运行接收端和发送端
★ UDP聊天实现(单线程)
1.创建一个消息发送类 UdpSenderDemo01.java
package com.ckfuture; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetSocketAddress; import java.net.SocketException; public class UdpSenderDemo01 { public static void main(String[] args) throws Exception { DatagramSocket socket = new DatagramSocket(8888); //准备数据 BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); while(true){ String data = reader.readLine(); byte[] datas = data.getBytes(); DatagramPacket packet = new DatagramPacket(datas,0,datas.length,new InetSocketAddress("localhost",6666)); socket.send(packet); //本地退出 if(data.equals("bye")){ break; } } //关闭资源 socket.close(); } }
2.创建一个接收消息类 UdpReceiveDemo01.java
package com.ckfuture; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.SocketException; public class UdpReceiveDemo01 { public static void main(String[] args) throws Exception { DatagramSocket socket = new DatagramSocket(6666); //死循环接收信息 while(true){ //准备接受消息 byte[] container = new byte[1024]; DatagramPacket packet = new DatagramPacket(container,0,container.length); socket.receive(packet);//阻塞式接收消息 //转换成字符串 byte[] data = packet.getData(); String receiveData = new String(data, 0, data.length); //输出接收的消息 System.out.println(receiveData); //断开连接 if(receiveData.equals("bye")){ break; } } socket.close(); } }
3.依次运行发送端和接收端
只是实现了一个循环发送一个循环接收,并没有实现双方聊天的效果。
★多线程
1.建立一个发送类 TalkSend.java
package com.ckfuture; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetSocketAddress; public class TalkSend implements Runnable { DatagramSocket socket=null; BufferedReader reader=null; private int fromPort;//自己的端口 private String toIP;//对方IP地址 private int toPort;//对方端口号 public TalkSend(int fromPort, String toIP, int toPort) { this.fromPort = fromPort; this.toIP = toIP; this.toPort = toPort; try{ socket = new DatagramSocket(fromPort); reader=new BufferedReader(new InputStreamReader(System.in)); }catch (Exception e){ e.printStackTrace(); } } @Override public void run() { while(true){ try{ String data=reader.readLine(); byte[] datas = data.getBytes(); DatagramPacket packet = new DatagramPacket(datas, 0, datas.length, new InetSocketAddress(this.toIP, this.toPort)); socket.send(packet); if (data.equals("bye")){ break; } }catch (Exception e){ e.printStackTrace(); } } socket.close(); } }
2.创建一个接收类 TalkReceive.java
package com.ckfuture; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.SocketException; public class TalkReceive implements Runnable{ DatagramSocket socket=null; private int port; private String msgFrom; public TalkReceive(int port,String msgFrom) { this.port = port; this.msgFrom=msgFrom; try { socket = new DatagramSocket(port); } catch (SocketException e) { e.printStackTrace(); } } @Override public void run() { while (true){ try { //准备接收数据 byte[] container = new byte[1024]; DatagramPacket packet = new DatagramPacket(container, 0, container.length); socket.receive(packet);//阻塞式接收信息 //断开连接 byte[] data = packet.getData(); String receiveData = new String(data, 0, data.length); System.out.println(msgFrom+":"+receiveData); if(receiveData.equals("bye")){ break; } } catch (IOException e) { e.printStackTrace(); } } socket.close(); } }
3.创建一个 测试端 TalkStudent.java
package com.ckfuture; public class TalkStudent { public static void main(String[] args) { new Thread(new TalkSend(7777,"localhost",9999)).start(); new Thread(new TalkReceive(8888,"teacher say")).start(); } }
4.创建另一个测试端 TalkTeacher.java
package com.ckfuture; public class TalkTeacher { public static void main(String[] args) { new Thread(new TalkSend(5555,"localhost",8888)).start(); new Thread(new TalkReceive(9999,"学生")).start(); } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!