Java的TCP Socket类在发送数据时是否阻塞

Nic*_*nks 2 java sockets tcp blocking

当我使用Javaa的Socket类发送一个字节数组时,在以下代码块中进行写调用,直到它验证了收件人已收到数据为止?

byte data[] = ...;
Socket socket = ...;

socket.getOutputStream().write(data); // blocking ?
Run Code Online (Sandbox Code Playgroud)

我问的原因是,如果我有一个我想要发送相同数据的套接字列表,我想尽可能有效地发送它,即有没有比这更好的方法:

ArrayList<Socket> sockets = ...;
byte data[] = ...;

for(int i = 0; i < sockets.size(); i++)
  sockets.getOutputStream().write(data);
Run Code Online (Sandbox Code Playgroud)

sar*_*old 5

TCP握手发生在connect(2)时间,而不是write(2)时间.

调用write(2)将阻塞,直到OS TCP发送缓冲区耗尽足以接受来自程序的更多数据.(我无法想象操作系统会解锁write(2)一个空闲字节的操作.)

您唯一的保证是客户端已经接受过去的数据,并且不会远远超过会话的TCP窗口大小加上内部OS缓冲区的大小.这些数据是否已经到达另一端点上的应用程序是另一层缓冲区 - 远程对等体上的TCP堆栈将确认收到的数据并在应用程序有机会处理之前将其存储在缓冲区中.