-1

我知道套接字有 setReceiveBufferSize 方法,但为什么 severSocket 有一个。你知道如果接受一个连接我会得到一个套接字来处理 io 的东西,所以我只关心套接字实例,我可以设置接收缓冲区。那么 serversocket setReceiveBufferSize 做什么工作呢?

 public synchronized void setReceiveBufferSize (int size) throws SocketException {
    if (!(size > 0)) {
        throw new IllegalArgumentException("negative receive size");
    }
    if (isClosed())
        throw new SocketException("Socket is closed");
    getImpl().setOption(SocketOptions.SO_RCVBUF, new Integer(size));
    }
4

2 回答 2

0

从文档中:

http://docs.oracle.com/javase/6/docs/api/java/net/ServerSocket.html#setReceiveBufferSize%28int%29

因此,从本质上讲,它为操作系统的 tcp 堆栈设置了一个提示,用于调整 TCP 窗口大小。这对于由于丢失包而导致的重传很重要,最佳设置取决于网络延迟、网络拥塞和传输的数据类型。

看这里:

http://en.wikipedia.org/wiki/TCP_Receive_Window

进行更详细的讨论

于 2013-04-23T10:08:46.703 回答
0

ServerSocket已经接受Socket时,协商接收缓冲区大小 >= 64k 已经为时已晚,因为 TCP 窗口缩放选项是在初始握手期间协商的。因此,它必须设置在ServerSocket并由接受的 继承Sockets,如 Javadoc 中所述。

于 2013-04-23T10:33:22.777 回答