利用多线程、网络编程设计一个聊天程序。要求通过监听指定的端口号、目标IP地址和目标端口号,实现消息的发送和接收功能,并把聊天内容显示出来。 Java 代码实现
时间: 2024-02-03 20:15:22 浏览: 13
以下是一个简单的基于Java的多线程、网络编程聊天程序实现:
```java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;
public class ChatServer {
public static final int PORT = 10086;
private ServerSocket serverSocket;
public ChatServer() throws IOException {
serverSocket = new ServerSocket(PORT);
}
public void service() {
while (true) {
Socket socket = null;
try {
socket = serverSocket.accept();
System.out.println("New client connected : " + socket.getInetAddress() + ":" + socket.getPort());
} catch (IOException e) {
e.printStackTrace();
}
// Start a new thread for the client
Thread t = new Thread(new ClientHandler(socket));
t.start();
}
}
private static class ClientHandler implements Runnable {
private Socket socket;
private BufferedReader in;
private PrintWriter out;
public ClientHandler(Socket socket) {
this.socket = socket;
try {
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
} catch (IOException e) {
e.printStackTrace();
}
}
public void run() {
try {
while (true) {
String str = in.readLine();
if (str == null) {
break;
}
System.out.println("Received from client: " + str);
out.println("Server received: " + str);
out.flush();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public static void main(String[] args) throws IOException {
ChatServer server = new ChatServer();
server.service();
}
}
```
```java
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;
public class ChatClient {
public static final String SERVER_IP = "localhost";
public static final int SERVER_PORT = 10086;
private Socket socket;
private BufferedReader in;
private PrintWriter out;
public ChatClient() throws IOException {
socket = new Socket(SERVER_IP, SERVER_PORT);
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()));
}
public void service() {
Scanner scanner = new Scanner(System.in);
try {
while (true) {
String str = scanner.nextLine();
if (str.equals("bye")) {
break;
}
out.println(str);
out.flush();
String echo = in.readLine();
System.out.println(echo);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) throws IOException {
ChatClient client = new ChatClient();
client.service();
}
}
```
可以在不同的控制台窗口中启动多个聊天客户端,它们将连接到服务器并通过向服务器发送消息来进行交互。服务器将显示接收到的消息,并将回应发送回客户端。