如何增加 SocketChannel 的发送缓冲区大小?

How to increase send buffer size of a SocketChannel?

我试图增加 SocketChannel 的发送缓冲区大小。我只想在一次写操作中发送我的 ByteBuffer 中的所有字节。这是我的代码:

channel = SocketChannel.open(address);
ByteBuffer buf = ByteBuffer.wrap(channelBytes);
channel.socket().setSendBufferSize(buf.remaining());
channel.write(buf);

即使我调用方法setSendBufferSize,套接字也不会发送超过131071 字节。 我该怎么办?

收件人是这样的:

构造函数

uplink = ServerSocketChannel.open();
uplink.socket().bind(new InetSocketAddress(UPLINK_PORT));
uplink.socket().setReceiveBufferSize(2*1024*1024);

运行方法

SocketChannel clientChannelUp = uplink.accept();
clientChannelUp.socket().setReceiveBufferSize(2*1024*1024);
clientChannelUp.socket().setSendBufferSize(2*1024*1024);
buffer = ByteBuffer.allocate(Short.MAX_VALUE*100);
clientChannelUp.read(buffer);
buffer.flip();

有了读写循环,我的代码是这样的:

传送器

while(buf.hasRemaining()) {
    channel.write(buf);
}

接收者

int r = clientChannelUp.read(buffer);
while(r==131071) {
    r=clientChannelUp.read(buffer);
}
buffer.flip();

您发布的代码块,直到所有数据都已传输到套接字发送缓冲区,与套接字发送缓冲区大小无关。你自己的实验证明了这一点。您没有将它设置为 131071,将其设置为 8192,但仍收到 131071 字节。

你的意思是 peer receive 不超过 131071 字节。

这是因为 its socket receive 缓冲区的大小。

要设置大于 64k 的套接字接收缓冲区大小,需要在连接套接字之前进行设置。对于服务器,这意味着在调用 accept().

之前在 ServerSocketServerSocketChannel 中设置它

然而你的基础objective是无法实现的。 TCP是字节流协议。它没有义务一次传送超过一个字节,或者在非阻塞模式下为零。如果要接收N个字节,一般要循环

最后我是这样解决的:

传送器

while(buf.hasRemaining()) {
    channel.write(buf);
}

接收方

int r = clientChannelUp.read(buffer);
while(r==131071) {
    r=clientChannelUp.read(buffer);
}
buffer.flip();

就我而言,把这个

clientChannelUp.socket().setReceiveBufferSize(2*1024*1024);
clientChannelUp.socket().setSendBufferSize(2*1024*1024);

在 accept() 和 connected() 中,它有效。