📜  Java的.net.ServerSocket类在Java中(1)

📅  最后修改于: 2023-12-03 15:02:05.494000             🧑  作者: Mango

Java的ServerSocket

在Java中,ServerSocket类用于创建TCP服务器,它等待来自客户端的连接请求,并在连接请求到达时执行一系列操作。该类相当于服务器的“监听器”,可以监听特定的端口号以接收连接请求。下面将对ServerSocket类进行详细介绍。

创建ServerSocket

要创建一个ServerSocket对象,可以使用以下代码:

try {
    ServerSocket serverSocket = new ServerSocket(port);
    // 处理连接请求
} catch (IOException e) {
    e.printStackTrace();
}

其中,port是要监听的端口号。在创建ServerSocket时,如果指定的端口已被占用,程序将抛出BindException异常。因此,在创建ServerSocket时应该放在一个try..catch块中,并处理可能的异常。

处理连接请求

ServerSocket对象开始监听端口时,它会等待来自客户端的连接请求。当连接请求到达时,ServerSocket会创建一个新的Socket对象来处理该请求,然后返回原始的ServerSocket对象。

try {
    ServerSocket serverSocket = new ServerSocket(port);
    while (true) {
        Socket clientSocket = serverSocket.accept();
        // 处理连接请求
    }
} catch (IOException e) {
    e.printStackTrace();
}

在上述代码中,accept()方法是阻塞的(即,它将一直等待连接请求到达),直到有连接请求到达时才会返回。当连接请求到达时,accept()方法将返回一个新的Socket对象,我们可以使用该对象来处理客户端请求。

处理客户端请求

一旦有客户端连接,我们就可以使用新的Socket对象来处理客户端请求。以下是客户端请求处理的示例代码:

try {
    ServerSocket serverSocket = new ServerSocket(port);
    while (true) {
        Socket clientSocket = serverSocket.accept();
        // 处理连接请求
        InputStream input = clientSocket.getInputStream();
        OutputStream output = clientSocket.getOutputStream();
        // 读取请求数据
        byte[] buffer = new byte[1024];
        int len = input.read(buffer);
        String request = new String(buffer, 0, len);
        // 发送响应数据
        String response = "Hello, World!";
        output.write(response.getBytes());
        output.flush();
        // 关闭连接
        clientSocket.close();
    }
} catch (IOException e) {
    e.printStackTrace();
}

在上述代码中,我们使用InputStreamOutputStream对象来读取客户端请求和发送响应数据。注意,必须调用flush()方法来确保发送的数据已经被完全写入到底层网络流。

关闭ServerSocket

一旦不再需要监听套接字,我们可以通过close()方法关闭ServerSocket对象。以下是关闭ServerSocket的示例代码:

try {
    ServerSocket serverSocket = new ServerSocket(port);
    while (true) {
        Socket clientSocket = serverSocket.accept();
        // 处理连接请求
        clientSocket.close();
    }
    serverSocket.close();
} catch (IOException e) {
    e.printStackTrace();
}

在上述示例中,我们注意到我们关闭了每个客户端连接的Socket对象,然后才关闭ServerSocket对象。这是因为如果我们在关闭ServerSocket之前未关闭所有客户端连接,客户端仍然可以向服务器发送数据,这可能导致数据包丢失,以及在不同操作系统之间提供不可预测的结果。

总结

Java中的ServerSocket类可以帮助我们创建TCP服务器来处理客户端连接请求。通过创建ServerSocket对象并监听特定端口,我们可以等待客户端连接,接收客户端请求,并向客户端发送响应。最后,我们可以通过调用close()方法关闭ServerSocket来停止监听套接字。