通过UDP实现网络聊天
多线程实现UDP网络聊天
1. 编写UDP发送线程UdpSendThread
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.*;
public class UdpSendTread implements Runnable{
DatagramSocket datagramSocket = null;
BufferedReader bufferedReader = null;
InetSocketAddress inetSocketAddress = null;
public UdpSendTread(int fromPort, int toPort, String toIp) {
// 创建 upd socket
try {
// 指定当前用户的Socket端口
datagramSocket = new DatagramSocket(fromPort);
} catch (SocketException e) {
e.printStackTrace();
}
// 创建读入流
bufferedReader = new BufferedReader(new InputStreamReader(System.in));
// 发送信息的目标ip地址和端口号
inetSocketAddress = new InetSocketAddress(toIp, toPort);
}
@Override
public void run() {
while (true) {
try {
// 读入行
System.out.println(datagramSocket.getLocalSocketAddress() + ": ");
String data = bufferedReader.readLine();
byte[] datas = data.getBytes();
// 创建udp发送包
DatagramPacket datagramPacket = new DatagramPacket(datas, datas.length, inetSocketAddress);
// udp 发送
datagramSocket.send(datagramPacket);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
2. 编写UDP接受线程 UdpReceiveThread
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class UdpReceiveTread implements Runnable {
DatagramSocket datagramSocket = null;
public UdpReceiveTread(int port) {
// 当其用户socket端口
try {
datagramSocket = new DatagramSocket(port);
} catch (SocketException e) {
e.printStackTrace();
}
}
@Override
public void run() {
while (true) {
try {
// 创建接受udp socket包
byte[] container = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(container, container.length);
// 阻塞式接受udp数据
datagramSocket.receive(datagramPacket);
// DatagramPacket 获取接受到的数据
byte[] data = datagramPacket.getData();
// byte 转换 String 并输出
String string = new String(data, 0, data.length);
System.out.println(datagramSocket.getLocalSocketAddress() + ":" + string);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
3. 编写用户1 Costomer_1
public class Costomer_1 {
public static void main(String[] args) {
// Udp 发送线程
UdpSendTread sendTread = new UdpSendTread(8888, 9999, "127.0.0.1");
// Udp 接受线程
UdpReceiveTread receiveTread = new UdpReceiveTread(7777);
new Thread(sendTread).start();
new Thread(receiveTread).start();
}
}
4. 编写用户2 Constomer_2
public class Costomer_2 {
public static void main(String[] args) {
// Udp 发送线程
UdpSendTread sendTread = new UdpSendTread(6666, 7777, "127.0.0.1");
// Udp 接受线程
UdpReceiveTread receiveTread = new UdpReceiveTread(9999);
new Thread(sendTread).start();
new Thread(receiveTread).start();
}
}
注意,用户类中的发送线程fromPort != 接受线程的port
5. 结果



本文介绍了一种使用UDP协议实现的网络聊天室系统。系统通过两个独立的多线程——发送线程和接收线程,实现了客户端之间的即时消息传递。发送线程负责将用户输入的消息打包并发送给指定的目标IP和端口,而接收线程则负责监听特定端口,接收来自其他客户端的消息。
850

被折叠的 条评论
为什么被折叠?



