// Client.java
package Test;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.util.Scanner;
public class Client {
private DatagramSocket socket;
private int localPort;
private ClientConnectServer clientConnectServerThread;
public Client() throws SocketException {
// 创建 DatagramSocket 实例并绑定到一个随机可用的端口上
this.socket = new DatagramSocket();
// 获取本地绑定的端口号
this.localPort = socket.getLocalPort();
System.out.println("本地端口号:" + localPort);
// 创建一个和服务器端保持通信的线程
clientConnectServerThread = new ClientConnectServer(socket);
}
public void startReceiving() {
// 启动线程以异步接收消息
clientConnectServerThread.start();
}
// 发送消息给指定 IP 地址和端口号的服务器
public void sendMessage(String ipAddress, int port, String message) {
try {
InetAddress address = InetAddress.getByName(ipAddress);
byte[] data = message.getBytes();
DatagramPacket packet = new DatagramPacket(data, data.length, address, port);
socket.send(packet);
System.out.println("消息已发送至 " + ipAddress + ":" + port + " - " + message);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
try {
Client client = new Client();
client.startReceiving(); // 启动消息接收线程
System.out.println("请输入接收方的 IP 地址和端口号 (例如,127.0.0.1 12345):");
String ipAddress = scanner.nextLine();
int port = scanner.nextInt();
while (true) {
scanner.nextLine(); // 消耗换行符
System.out.println("请输入消息: ");
String message = scanner.nextLine();
// 发送消息给指定的 IP 地址和端口号
client.sendMessage(ipAddress, port, message);
System.out.println("等待接收消息...");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
scanner.close();
}
}
}
package Test;
import TeClient.Common.Message;
import java.io.ByteArrayInputStream;
import java.io.ObjectInputStream;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
public class ClientConnectServer extends Thread {
private DatagramSocket socket;
public ClientConnectServer(DatagramSocket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
System.out.println("客户端已连接,等待从服务器发来的消息");
byte[] receiveBuffer = new byte[1024]; // 缓冲区大小
DatagramPacket receivePacket = new DatagramPacket(receiveBuffer, receiveBuffer.length);
boolean flag = true;
while (flag) {
// 接收服务器发送的数据报文
socket.receive(receivePacket);
// 将接收到的数据转换为Message对象
byte[] data = receivePacket.getData();
int len = data.length;
String msg = new String(data, 0, len);
if (msg.equals("exit")) {
flag = false;
break;
}
System.out.println("收到信息 " + msg);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}