用java基于udp做一个聊天系统
时间: 2023-05-27 07:04:27 浏览: 106
使用javafx实现的基于udp、tcp的聊天GUI应用,可用作Java大作业、计网课程设计.zip
以下是一个基于UDP的简单聊天系统的Java代码示例:
<!--language: java-->
```java
import java.io.*;
import java.net.*;
public class ChatServer implements Runnable {
// 设置端口号
private static final int PORT = 8888;
// 设置缓冲区大小
private static final int BUFFER_SIZE = 1024;
// 创建DatagramSocket对象
private DatagramSocket socket;
// 创建数据包对象
private DatagramPacket packet;
// 创建接收信息的字节数组
private byte[] buf = new byte[BUFFER_SIZE];
public ChatServer() throws IOException {
// 创建DatagramSocket对象并绑定端口号
socket = new DatagramSocket(PORT);
}
@Override
public void run() {
while (true) {
try {
// 接收数据包
packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);
// 获取发送方地址和端口号
InetAddress address = packet.getAddress();
int port = packet.getPort();
// 将接收到的数据转换成字符串
String receiveStr = new String(packet.getData(), 0, packet.getLength());
// 输出接收到的消息
System.out.println(address + ":" + port + " >>> " + receiveStr);
// 发送信息到所有客户端
this.broadcast(receiveStr);
} catch (IOException e) {
e.printStackTrace();
}
}
}
// 发送信息到所有客户端
public void broadcast(String message) {
for (InetClient client : clients) {
try {
// 将消息打包成数据包
byte[] sendBuf = message.getBytes();
DatagramPacket sendPacket = new DatagramPacket(sendBuf, sendBuf.length, client.getAddress(), client.getPort());
socket.send(sendPacket);
} catch (IOException e) {
e.printStackTrace();
}
}
}
// 开启服务器
public void start() {
Thread thread = new Thread(this);
thread.start();
System.out.println("服务器已启动...");
}
public static void main(String[] args) throws IOException {
ChatServer chatServer = new ChatServer();
chatServer.start();
}
}
```
在以上代码中,我们创建了一个 `ChatServer` 类来处理信息的接收和广播,我们通过 `DatagramSocket` 和 `DatagramPacket` 来进行UDP数据报接收和发送。对于接收到的数据报,我们可以通过 `packet.getData()` 方法获取字节数据,并通过 `packet.getLength()` 方法获取消息长度。同时,我们还可以通过 `InetAddress` 和 `port` 获取发送方的IP地址和端口号。
我们还需要创建一个客户端来和服务器进行通信:
<!--language: java-->
```java
import java.io.*;
import java.net.*;
public class ChatClient implements Runnable {
// 设置服务器IP和端口号
private static final String SERVER_HOST = "localhost";
private static final int SERVER_PORT = 8888;
// 设置缓冲区大小
private static final int BUFFER_SIZE = 1024;
// 创建DatagramSocket对象
private DatagramSocket socket;
// 创建数据包对象
private DatagramPacket packet;
// 创建接收信息的字节数组
private byte[] buf = new byte[BUFFER_SIZE];
// 客户端是否连接标志
private boolean connected = false;
@Override
public void run() {
while (true) {
try {
// 接收数据包
packet = new DatagramPacket(buf, buf.length);
socket.receive(packet);
// 将接收到的数据转换成字符串
String receiveStr = new String(packet.getData(), 0, packet.getLength());
// 输出接收到的消息
System.out.println(receiveStr);
} catch (IOException e) {
e.printStackTrace();
}
}
}
// 连接服务器
public void connect() {
try {
// 创建DatagramSocket对象
socket = new DatagramSocket();
// 启动客户端接收线程
Thread thread = new Thread(this);
thread.start();
connected = true;
System.out.println("连接服务器成功...");
} catch (SocketException e) {
e.printStackTrace();
}
}
// 发送消息到服务器
public void send(String message) {
try {
// 将消息打包成数据包
byte[] sendBuf = message.getBytes();
DatagramPacket sendPacket = new DatagramPacket(sendBuf, sendBuf.length,
InetAddress.getByName(SERVER_HOST), SERVER_PORT);
socket.send(sendPacket);
} catch (IOException e) {
e.printStackTrace();
}
}
// 客户端主方法
public static void main(String[] args) {
ChatClient chatClient = new ChatClient();
chatClient.connect();
while (chatClient.connected) {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
try {
String message = reader.readLine();
chatClient.send(message);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
```
我们创建了一个 `ChatClient` 类用于连接服务器和发送消息。我们同样通过 `DatagramSocket` 和 `DatagramPacket` 进行UDP数据报接收和发送。对于接收到的数据报,我们可以通过 `packet.getData()` 方法获取字节数据,并通过 `packet.getLength()` 方法获取消息长度。
在主方法中,我们通过 `connect()` 方法连接服务器,并通过 `send()` 方法发送消息。通过 `BufferedReader` 和 `InputStreamReader` 从控制台输入信息并发送。
现在,我们就可以启动一个服务器和多个客户端,在控制台中可以看到发送和接收到的消息。注意,这个代码示例只是一个简单的聊天系统,没有考虑到多线程和异常处理等问题,所以在实际使用中还需要做进一步的优化。
阅读全文