- 发送消息端
package top.xvgenwen;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
import java.net.SocketException;
public class SendMessage implements Runnable {
// 用户名
private String userName;
// 发送消息端口
private int port;
// 对方 Ip 地址
private String toIp;
// 对方接收消息端口
private int toPort;
public SendMessage(String userName, int port, String toIp, int toPort) {
this.userName = userName;
this.port = port;
this.toIp = toIp;
this.toPort = toPort;
}
@Override
public void run() {
DatagramSocket socket = null;
try {
socket = new DatagramSocket(port);
while (true) {
// 从控制台读取消息
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
String msg = reader.readLine();
// 发送消息
byte[] data = (userName + ": " + msg).getBytes();
DatagramPacket packet = new DatagramPacket(data, 0, data.length, new InetSocketAddress(toIp, toPort));
socket.send(packet);
//输入 bye 结束聊天
if ("bye".equals(msg)) {
break;
}
}
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
// 关闭资源
socket.close();
}
}
}
- 接收消息端
package top.xvgenwen;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
/**
* 接收消息
*
* @author Xu Albter
*/
public class ReceiveMessge implements Runnable {
// 接收消息端口
private int port;
public ReceiveMessge(int port) {
this.port = port;
}
@Override
public void run() {
DatagramSocket socket = null;
try {
socket = new DatagramSocket(port);
while (true) {
// 接收消息
byte[] container = new byte[1024];
DatagramPacket packet = new DatagramPacket(container, 0, container.length);
socket.receive(packet);
// 得到消息内容
byte[] data = packet.getData();
String msg = new String(data, 0, data.length);
// 控制台输出消息
System.out.println(msg);
// 收到 bye 结束聊天
if ("bye".equals(msg.trim())) {
break;
}
}
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
// 关闭资源
socket.close();
}
}
}
- 用户端
创建两个用户端,即创建两个启动类即可
package top.xvgenwen;
/**
* 用户 Xu Albter
*
* @author xu
*/
public class XuAlbter {
public static void main(String[] args) {
// 用户 XuAlbter 的发送消息线程
new Thread(new SendMessage("XuAlber", 5555, "127.0.0.1", 2222)).start();
// 用户 XuAlbter 的接收消息线程
new Thread(new ReceiveMessge(6666)).start();
}
}
package top.xvgenwen;
/**
* 用户 Zhang Abby
*
* @author xu
*/
public class ZhangAbby {
public static void main(String[] args) {
// 用户 ZhangAbby 的发送消息线程
new Thread(new SendMessage("ZhangAbby", 1111, "127.0.0.1", 6666)).start();
// // 用户 ZhangAbby 的发送消息线程
new Thread(new ReceiveMessge(2222)).start();
}
}
运行结果截图: