2015-01-20 60 views
0

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

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); 

Run方法

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

该如何实际工作中依赖于操作系统的。您可以调用getSendBufferSize来查看缓冲区的实际大小。 – 2015-01-20 22:22:27

+0

如果我调用getSendBufferSize而不先设置它,结果是8192.但是通道发送131071个字节。我很困惑 – 2015-01-20 22:26:35

+0

你怎么知道?使用该代码,您无法分辨发送的数量。 – EJP 2015-01-20 23:00:51

回答

1

您已发布的块,直到所有的数据已经被转移到插座发送缓冲区的代码,独立于套接字发送缓冲区的大小。你自己的实验证明。您没有将其设置为131071,将其保留为8192,仍然收到131071个字节。

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

这是因为其大小插座收到缓冲区。

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

但是你的基本目标是不可实现的。 TCP是一种字节流协议。它没有义务一次传送多个字节,或者在非阻塞模式下传送零个字节。如果你想收到N字节,一般你必须循环。

+0

不起作用。接收者是一个ServerSocketChannel。在构造函数中,我这样做:uplink.socket()。setReceiveBufferSize(2 * 1024 * 1024);但没有任何 – 2015-01-20 23:25:25

+0

什么是'上行链路'? – EJP 2015-01-20 23:32:47

+0

之后立即调用'getReceiveBufferSize()'的结果是什么? – EJP 2015-01-20 23:34:53

-3

在我以这种方式解决了底:

发射

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

接收机

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

这不会解决任何问题。写循环可能会永久自旋锁定,读循环完全是无意义的。它抛弃所有数据直到最后一次部分读取。 – EJP 2015-02-18 01:30:50

+0

它适用于我的应用程序。为什么read循环会抛出所有数据直到最后一次部分读取?如果不对,请告诉我我该怎么做。 – 2015-02-18 14:04:38

+0

请人们,不要这样做......你至少试图增加你的接收缓冲区大小('clientChannelUp.socket()。setReceiveBufferSize(xxx)'),因为@EJP也指出你(几次...) )? *任何东西*都更好,可以对经验确定的价值进行硬编码。 – Matthieu 2016-04-13 16:39:37