我试图增加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();
答案 0 :(得分:1)
您发布的代码阻塞,直到所有数据都已传输到套接字发送缓冲区,与套接字发送缓冲区大小无关。你自己的实验证明了这一点您没有将其设置为131071,将其保留为8192,但仍然收到了131071个字节。
您的意思是 peer
这是因为 套接字接收缓冲区的大小。
要设置大于64k的套接字接收缓冲区大小,需要在连接套接字之前设置它。如果是服务器,则表示在调用ServerSocket
之前在ServerSocketChannel
或accept()
中进行设置。
但是你的基本目标是不可实现的。 TCP是字节流协议。它没有义务一次传递多个字节,或者在非阻塞模式下传递零。如果你想接收 N 字节,通常你必须循环。
答案 1 :(得分:1)
以我为例,
comp2
在accept()和connected()中,它可以正常工作。
答案 2 :(得分:-3)
最后我以这种方式解决了:
发射机
while(buf.hasRemaining()) {
channel.write(buf);
}
接收器
int r = clientChannelUp.read(buffer);
while(r==131071) {
r=clientChannelUp.read(buffer);
}
buffer.flip();