如何增加 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()
.
之前在 ServerSocket
或 ServerSocketChannel
中设置它
然而你的基础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() 中,它有效。
我试图增加 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()
.
ServerSocket
或 ServerSocketChannel
中设置它
然而你的基础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() 中,它有效。