用Java编写一个基于Socket和C/S模型的聊天室功能要求实现单个Server与多个Client互发消息聊天室窗口里显示发送信息的时间戳+用户ID+内容优先采用UDP引入多线程将手机热点用作路由器建立内网从而实现多台计算机互通消息的程序
时间: 2024-02-28 08:56:07 浏览: 22
好的,我会给出一个简单的Java程序示例,实现基于Socket和C/S模型的聊天室功能,满足上述要求。
首先,我们需要在Server端实现以下功能:
```java
import java.net.*;
import java.io.*;
public class ChatServer {
public static void main(String[] args) {
try {
DatagramSocket serverSocket = new DatagramSocket(9876);
byte[] receiveData = new byte[1024];
byte[] sendData = new byte[1024];
while (true) {
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
serverSocket.receive(receivePacket);
String message = new String(receivePacket.getData());
InetAddress IPAddress = receivePacket.getAddress();
int port = receivePacket.getPort();
System.out.println("From " + IPAddress + ":" + port + " Message: " + message);
String replyMessage = "Received: " + message;
sendData = replyMessage.getBytes();
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, port);
serverSocket.send(sendPacket);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
```
上述代码实现了一个简单的UDP服务器,监听端口号为9876,可以接收客户端发送的消息,并将消息回复给客户端。
接下来,我们需要在客户端实现以下功能:
```java
import java.net.*;
import java.io.*;
public class ChatClient {
public static void main(String[] args) {
try {
DatagramSocket clientSocket = new DatagramSocket();
InetAddress IPAddress = InetAddress.getByName("localhost");
BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
byte[] sendData = new byte[1024];
byte[] receiveData = new byte[1024];
while (true) {
String message = inFromUser.readLine();
sendData = message.getBytes();
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, IPAddress, 9876);
clientSocket.send(sendPacket);
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
clientSocket.receive(receivePacket);
String replyMessage = new String(receivePacket.getData());
System.out.println("From Server: " + replyMessage);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
```
上述代码实现了一个简单的UDP客户端,可以向服务器发送消息,并接收服务器回复的消息。
接下来,我们需要将上述代码进行改造,实现一个基于Socket和C/S模型的聊天室。
在Server端,我们需要创建一个ServerSocket对象,用于监听客户端的连接请求。当有客户端连接时,我们需要为每个客户端连接创建一个线程,用于处理客户端的消息传输和响应。
```java
import java.net.*;
import java.io.*;
public class ChatServer {
public static void main(String[] args) {
try {
ServerSocket serverSocket = new ServerSocket(9876);
while (true) {
Socket socket = serverSocket.accept();
ChatServerThread thread = new ChatServerThread(socket);
thread.start();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
class ChatServerThread extends Thread {
private Socket socket;
private int clientID;
public ChatServerThread(Socket socket) {
this.socket = socket;
this.clientID = socket.getPort();
}
@Override
public void run() {
try {
BufferedReader inFromClient = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter outToClient = new PrintWriter(socket.getOutputStream(), true);
String message;
while ((message = inFromClient.readLine()) != null) {
System.out.println("From Client " + clientID + ": " + message);
outToClient.println("Received: " + message);
}
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
```
上述代码中,ChatServerThread类是一个继承自Thread类的线程类,用于处理客户端连接。当一个客户端连接到服务器时,ChatServerThread会创建一个新的线程,用于处理这个客户端的消息传输和响应。在run方法中,我们通过BufferedReader和PrintWriter对象实现数据的读写,处理客户端发送的消息,并将回复消息发送给客户端。
在Client端,我们需要创建一个Socket对象,用于与服务器建立连接。在聊天室中,我们需要不断地接收用户输入的消息,并将消息发送给服务器。
```java
import java.net.*;
import java.io.*;
public class ChatClient {
public static void main(String[] args) {
try {
Socket socket = new Socket("localhost", 9876);
BufferedReader inFromUser = new BufferedReader(new InputStreamReader(System.in));
BufferedReader inFromServer = new BufferedReader(new InputStreamReader(socket.getInputStream()));
PrintWriter outToServer = new PrintWriter(socket.getOutputStream(), true);
String message;
while ((message = inFromUser.readLine()) != null) {
outToServer.println(message);
String replyMessage = inFromServer.readLine();
System.out.println("From Server: " + replyMessage);
}
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
```
上述代码中,我们通过Socket对象与服务器建立连接。在while循环中,我们不断地读取用户输入的消息,并将消息发送给服务器。同时,我们通过BufferedReader对象接收服务器回复的消息,并将消息显示在聊天室窗口中。
综上所述,通过上述代码,我们可以实现一个基于Socket和C/S模型的聊天室,满足上述要求。在实际应用中,还需要根据具体情况进行调整和优化。