java tcp实现聊天室
时间: 2023-11-30 10:04:29 浏览: 39
Java TCP 实现聊天室需要通过网络套接字实现,具体步骤如下:
1. 创建服务器端和客户端的 Socket 连接。服务器端需要绑定一个端口号来监听客户端的连接请求。
2. 服务器端需要开启一个线程来接收客户端的连接请求,并创建一个对应的 Socket 连接。客户端需要连接服务器端的 Socket 连接。
3. 服务器端将客户端的 Socket 连接保存在一个集合中,以便后续广播消息给所有客户端。
4. 客户端和服务器端都需要开启一个线程来处理接收和发送消息。
5. 客户端发送消息时,需要将消息发送给服务器端,服务器端再将消息广播给所有客户端。
下面是一个简单的 Java TCP 实现聊天室的示例代码:
服务器端代码:
```java
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
public class Server {
private ServerSocket serverSocket;
private List<Socket> clients = new ArrayList<>();
public Server(int port) {
try {
serverSocket = new ServerSocket(port);
} catch (IOException e) {
e.printStackTrace();
}
}
public void start() {
System.out.println("Server started!");
while (true) {
try {
Socket client = serverSocket.accept();
clients.add(client);
new Thread(new ServerHandler(client)).start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
private class ServerHandler implements Runnable {
private Socket client;
public ServerHandler(Socket client) {
this.client = client;
}
@Override
public void run() {
try {
InputStream is = client.getInputStream();
byte[] buffer = new byte[1024];
int len;
while ((len = is.read(buffer)) != -1) {
String message = new String(buffer, 0, len);
System.out.println("Received from client: " + message);
broadcast(message);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
client.close();
clients.remove(client);
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
private void broadcast(String message) {
for (Socket client : clients) {
try {
OutputStream os = client.getOutputStream();
os.write(message.getBytes());
os.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
Server server = new Server(8888);
server.start();
}
}
```
客户端代码:
```java
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Scanner;
public class Client {
private Socket socket;
public void connect(String host, int port) {
try {
socket = new Socket(host, port);
new Thread(new ClientHandler(socket)).start();
} catch (IOException e) {
e.printStackTrace();
}
}
public void send(String message) {
try {
OutputStream os = socket.getOutputStream();
os.write(message.getBytes());
os.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
private class ClientHandler implements Runnable {
private Socket socket;
public ClientHandler(Socket socket) {
this.socket = socket;
}
@Override
public void run() {
try {
InputStream is = socket.getInputStream();
byte[] buffer = new byte[1024];
int len;
while ((len = is.read(buffer)) != -1) {
String message = new String(buffer, 0, len);
System.out.println("Received from server: " + message);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
Client client = new Client();
client.connect("localhost", 8888);
Scanner scanner = new Scanner(System.in);
while (true) {
String message = scanner.nextLine();
client.send(message);
}
}
}
```
这个简单的聊天室支持多个客户端连接,客户端发送的消息会被广播给所有客户端。