简单实现 服务器与客户端的聊天 使用 UDP通信
写这篇的原因之一是为了与之前的TCP通信进行对比。
- 先了解服务器与客户端交互是如何实现的
- 代码实现
- 聊天效果截图
一、先了解UDP协议中 两个主机如何发送数据:
二、代码实现:
代码只是作为一个记录,具体实现还可以将其进行优化,修改。
个人觉得有思路要比敲代码更重要
-
发送类:Send.java
package udp通信; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; /** * 发送端:无返回值,将指定的字节数组发送给指定的主机: IP:PORT * * @author 轩xuan * */ public class Send { @SuppressWarnings("resource") public void udpsend(byte[] buf, InetAddress address, int port) throws IOException { DatagramPacket datagrampacket = new DatagramPacket(buf, buf.length, address, port); new DatagramSocket().send(datagrampacket); } }
-
接收类:Recevie.java
package udp通信; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; /** * 接收端:返回接收的字节数组 * * @author 轩xuan * */ public class Recevie { @SuppressWarnings("resource") public byte[] udprecevie(int port) throws IOException { DatagramSocket datagramsocket = new DatagramSocket(port);// 绑定端口 byte[] buf = new byte[1024]; datagramsocket.receive(new DatagramPacket(buf, buf.length)); datagramsocket.close(); return buf; } }
-
男朋友:UDPBoy.java
package udp通信; import java.io.IOException; import java.net.InetAddress; import java.util.Scanner; /** * 实现UDP协议: * * 男朋友 * * 本地端口:6666 * * @author 轩xuan * */ public class UDPBoy { public static void main(String[] args) throws IOException { Scanner sc = new Scanner(System.in); boolean flag = true; System.out.println("男方"); while (flag) { System.out.print("女朋友:\t"); byte[] buf = new Recevie().udprecevie(6666);// 绑定端口,返回接收的字节数组 System.out.println(new String(buf, 0, buf.length)); System.out.print("\n我:\t"); new Send().udpsend(sc.next().getBytes(), InetAddress.getByName("127.0.0.1"), 7777);// 指定发送:数据、对方IP、端口 System.out.println("---------------------------------------\n"); } sc.close(); } }
-
女朋友:UDPGirl.java
package udp通信; import java.io.IOException; import java.net.InetAddress; import java.util.Scanner; /** * 假定女生主动了。。。哈哈 * * 实现UDP协议: * * 女朋友 本地端口: 7777 * * @author 轩xuan * */ public class UDPGirl { public static void main(String[] args) throws IOException { Scanner sc = new Scanner(System.in); boolean flag = true; System.out.println("女方"); while (flag) { System.out.print("我:\t"); new Send().udpsend(sc.next().getBytes(), InetAddress.getByName("127.0.0.1"), 6666);// 指定发送:数据、对方IP、端口 System.out.print("\n男朋友:\t"); byte[] buf = new Recevie().udprecevie(7777);// 绑定端口,返回接收的字节数组 System.out.println(new String(buf, 0, buf.length)); System.out.println("---------------------------------------\n"); } sc.close(); } }
三、实现截图:
(为了方便查看具体实现功能,使用两个dos窗口,运行)
- 假定先让女方发送消息。
- 运行前:先准备好两个控制台:
- 然后运行男朋友类,锁定其中一个控制台,让他显示男方。
- 接着运行女朋友类。
- 在女方的控制台先输入。
- 接着男方回复。
- 见下图
《在绝妙的五月》---海涅
在绝妙的五月
一切花蕾在喷涌
这时我的心头
爱情已萌动
在绝妙的五月
一切鸟儿在欢唱
这是我向她供认了
我的眷恋与渴望