跳到主要内容

用 Java 的套接字编程实现一个多线程的回显(echo)服务器 ?

参考答案:

在 Java 中,你可以使用 ServerSocketSocket 类来创建一个简单的多线程回显(echo)服务器。下面是一个简单的示例,展示了如何实现这样一个服务器:

import java.io.*;
import java.net.*;

public class EchoServer {
    private static final int PORT = 8080;
    private static final int BACKLOG = 10;

    public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(PORT, BACKLOG);
        System.out.println("Echo server started on port " + PORT);

        while (true) {
            final Socket clientSocket = serverSocket.accept();
            System.out.println("Accepted connection from " + clientSocket.getRemoteSocketAddress());

            new Thread(new Runnable() {
                @Override
                public void run() {
                    handleRequest(clientSocket);
                }
            }).start();
        }
    }

    private static void handleRequest(Socket clientSocket) {
        try {
            BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
            PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);

            String inputLine;
            while ((inputLine = in.readLine()) != null) {
                out.println(inputLine);
            }

            System.out.println("Connection closed by " + clientSocket.getRemoteSocketAddress());
        } catch (IOException e) {
            System.err.println("Error handling request from " + clientSocket.getRemoteSocketAddress() + ": " + e.getMessage());
        } finally {
            try {
                clientSocket.close();
            } catch (IOException e) {
                System.err.println("Error closing socket: " + e.getMessage());
            }
        }
    }
}

这个服务器在端口 8080 上监听连接。每当有新的客户端连接时,服务器都会接受连接并创建一个新的线程来处理该连接。每个线程都会读取从客户端发送来的数据,并将其回显(echo)回客户端。

要运行这个服务器,你只需要将上述代码保存到一个名为 EchoServer.java 的文件中,然后使用 javac 命令编译它,并使用 java 命令运行它:

javac EchoServer.java
java EchoServer

然后,你可以使用任何支持 TCP 的客户端(例如 Telnet 或另一个 Java 套接字客户端)连接到这个服务器,并发送一些消息来测试它。

注意:这个示例没有处理一些可能的异常情况,例如客户端突然断开连接。在实际应用中,你可能需要添加更多的错误处理和异常处理代码来确保程序的健壮性。