我正在阅读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运行它。