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

时间:2015-01-20 22:07:18

标签: java bytebuffer 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();

3 个答案:

答案 0 :(得分:1)

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

您的意思是 peer

这是因为 套接字接收缓冲区的大小。

要设置大于64k的套接字接收缓冲区大小,需要在连接套接字之前设置它。如果是服务器,则表示在调用ServerSocket之前在ServerSocketChannelaccept()中进行设置。

但是你的基本目标是不可实现的。 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();