为什么java.nio.SocketChannel不发送数据(Jdiameter)?

时间:2014-03-18 11:35:28

标签: java sockets mobicents restcomm diameter-protocol

我创建简单直径的客户端和服务器(Link to sources)。客户端必须发送10000 ccr消息,但在wireshark中,我发现只会发送~300 ccr消息。其他消息在客户端上引发超时。我使用Windows 7在不同的计算机上运行服务器和客户端。我在JDiameter源 line where jdiameter sended ccr (line 280)中找到了,我想如果发送套接字的缓冲区已经完全没有发送ccr。我在第280行之前添加了这段代码

while(bytes.hasRemaining())

客户端发送~9900 ccr,但非常慢。我测试了客户端在其他直径服务器上写了c ++,客户端(在jdiameter上没有我的更改)发送~7000 ccr,但这个服务器托管在debian上。

我不知道如何解决这个问题,谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

如果发送方的发送返回零,则表示发送方的套接字发送缓冲区已满,这反过来意味着接收方的套接字接收缓冲区已满,这反过来意味着接收器的读取速度比发送者发送的速度慢。

因此加速接收器。

NB在非阻塞模式下,仅在write()调用返回零时循环是不够的。如果write()返回零,您必须:

  1. 取消注册OP_READ的频道,并将其注册为OP_WRITE
  2. 返回选择循环。
  3. OP_WRITE触发时,请再次写入。这一次,如果没有返回零,请取消注册OP_WRITE,并(可能根据您的要求)注册OP_READ
  4. 请注意,始终为OP_WRITE注册的频道也不正确。套接字通道几乎总是可写的,这意味着套接字发送缓冲区中几乎总是有空间。您感兴趣的是 - 可写和可写之间的转换