当我使用Javaa的Socket类发送一个字节数组时,在以下代码块中进行写调用,直到它验证收件人已收到数据为止?
byte data[] = ...;
Socket socket = ...;
socket.getOutputStream().write(data); // blocking ?
我问的原因是,如果我有一个我希望发送相同数据的套接字列表,我想尽可能有效地发送它,即有没有比这更好的方法:
ArrayList<Socket> sockets = ...;
byte data[] = ...;
for(int i = 0; i < sockets.size(); i++)
sockets.getOutputStream().write(data);
答案 0 :(得分:5)
TCP握手发生在connect(2)
时间,而不是write(2)
时间。
对write(2)
的调用将阻塞,直到OS TCP发送缓冲区耗尽足以接受来自程序的更多数据。 (我无法想象操作系统会为一个空闲字节解锁write(2)
操作。)
唯一的保证是客户端已经接受了过去的数据,并且不会远远超过会话的TCP窗口大小加上内部OS缓冲区的大小。是否有任何数据到达另一端的应用程序是另一层缓冲区 - 远程对等体上的TCP堆栈将确认收到的数据并在应用程序之前将其存储在缓冲区中有机会处理它。