当Java Socket OutpurStream的发送缓冲区已满且写入操作被阻止时,有人可以帮助解释这种奇怪的行为吗?

时间:2017-03-07 12:53:48

标签: java sockets block

我正在阅读Java中的Tcp Ip套接字。它表示当发送缓冲区已满时,对Socket的OutputSream.write()的调用将阻塞,直到空间可用。我写了一个显示奇怪行为的测试。 这是服务器端代码。

public class SocketServer {
public static final Logger LOGGER = LoggerFactory.getLogger(SocketServer.class);
public static final int PORT = 8081;

public static void main(String[] args) throws IOException, InterruptedException {
    ServerSocket serverSocket = new ServerSocket(PORT);
    Socket clientSocket = serverSocket.accept();
    InputStream in = clientSocket.getInputStream();
    System.out.println(in.read());
    System.out.println("getReceiveBufferSize " + clientSocket.getReceiveBufferSize());

    while (true) {
    Thread.sleep(12000);
    }
}
}

这是客户端代码。

public class SocketClient {
public static final Logger LOGGER = LoggerFactory.getLogger(SocketClient.class);

public static void main(String[] args) throws IOException {
    Socket socket = new Socket();
    socket.connect(new InetSocketAddress("127.0.0.1", SocketServer.PORT));
    OutputStream out = socket.getOutputStream();
    System.out.println("SendBufferSize " + socket.getSendBufferSize());
    int count = Integer.MAX_VALUE;

    for (int i = 0; i < count; i++) {
    out.write(1);
    LOGGER.info("{} bytes", i + 1);
    }
    LOGGER.info("send over!");
}
}

我运行服务器和客户端。客户端不断向服务器发送单个字节并快速打印计数器。当计数器进入195224时,它会减慢速度。它会写一个字节,停止几秒钟并保持运行,但不会停止。 我认为如果写入客户端阻塞,线程将保持,日志将停止打印。发生了什么以及为什么它似乎没有被阻止?虽然我知道我不能说它没有被我的测试阻止,但我无法解释测试。

以下是客户端输出的一部分。

2017-03-07 20:28:45,455 [main] INFO  tcpip.socket.underhood.deadlock.SocketClient - 195224 bytes
2017-03-07 20:28:46,655 [main] INFO  tcpip.socket.underhood.deadlock.SocketClient - 195225 bytes
2017-03-07 20:28:49,056 [main] INFO  tcpip.socket.underhood.deadlock.SocketClient - 195226 bytes
2017-03-07 20:28:53,856 [main] INFO  tcpip.socket.underhood.deadlock.SocketClient - 195227 bytes

我在Windows 10上使用Java 8运行它。

0 个答案:

没有答案