Java Socket阻塞模式

简介

在进行网络通信时,Java提供了Socket类来实现客户端和服务器之间的数据传输。Socket类是基于TCP协议的,它可以用于建立可靠的连接并进行双向通信。

Socket通信可以使用阻塞模式和非阻塞模式。阻塞模式是指当Socket进行读写操作时,如果没有数据可读或无法立即写入数据,线程将会被阻塞,直到有可用的数据。相反,非阻塞模式下,Socket读写操作会立即返回,无论是否有可用的数据。

本文将重点介绍Java Socket的阻塞模式,并提供示例代码来演示它的使用。

阻塞模式的实现

Java的Socket类默认使用阻塞模式。在阻塞模式下,当调用Socket的读取方法(如read())时,如果没有可用的数据,线程将会被阻塞,直到有数据可读。同样,当调用写入方法(如write())时,如果Socket缓冲区已满,线程将会被阻塞,直到有空闲空间。

下面是一个简单的示例代码,演示了阻塞模式下的Socket通信:

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ServerSocket;
import java.net.Socket;

public class SocketServer {
    public static void main(String[] args) throws Exception {
        // 创建ServerSocket对象,监听指定端口
        ServerSocket serverSocket = new ServerSocket(8888);
        System.out.println("Server started.");

        // 接受客户端连接
        Socket clientSocket = serverSocket.accept();
        System.out.println("Client connected.");

        // 创建输入输出流
        BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
        PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true);

        // 读取客户端发送的数据
        String inputLine;
        while ((inputLine = in.readLine()) != null) {
            System.out.println("Received from client: " + inputLine);

            // 向客户端发送响应数据
            out.println("Server response: " + inputLine);

            // 如果客户端发送的数据为"bye",则退出循环
            if (inputLine.equals("bye")) {
                break;
            }
        }

        // 关闭连接
        in.close();
        out.close();
        clientSocket.close();
        serverSocket.close();
        System.out.println("Server stopped.");
    }
}
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class SocketClient {
    public static void main(String[] args) throws Exception {
        // 创建Socket对象,指定服务器IP和端口
        Socket socket = new Socket("localhost", 8888);

        // 创建输入输出流
        BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
        PrintWriter out = new PrintWriter(socket.getOutputStream(), true);

        // 向服务器发送数据
        out.println("Hello, Server!");

        // 读取服务器响应数据
        String response = in.readLine();
        System.out.println("Received from server: " + response);

        // 关闭连接
        in.close();
        out.close();
        socket.close();
    }
}

以上代码中,SocketServer是服务器端代码,SocketClient是客户端代码。服务器端首先创建一个ServerSocket对象,并监听指定端口(这里是8888)。然后通过accept()方法接受客户端的连接,创建输入输出流来进行数据的读取和写入。客户端通过创建Socket对象,并指定服务器IP和端口来与服务器建立连接,然后同样创建输入输出流进行数据的读取和写入。

总结

Java Socket的阻塞模式是默认的通信模式。它使用简单直观,适用于大部分的网络通信场景。当Socket进行读写操作时,如果没有可用的数据或无法立即写入数据,线程将会被阻塞,直到有可用的数据或有空闲空间。

在实际应用中,我们可以根据具体需求选择使用阻塞模式或非阻塞模式来实现网络通信。

"阻塞模式是指当Socket进行读写操作时,如果没有数据可读或无法立即写入数据,线程将会被阻塞,直