繁体   English   中英

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

[英]Why java.nio.SocketChannel not send data (Jdiameter)?

我创建了简单的直径客户端和服务器( 链接到源代码 )。 客户端必须发送10000条CCR消息,但是在Wireshark中,我只会发送大约300条CCR消息。 其他消息导致客户端超时。 我在装有Windows 7的不同计算机上运行服务器和客户端。我在JDiameter源代码行中找到了jdiameter发送了ccr(第280行),并且我认为万一套接字发送缓冲区已满,则不会发送ccr。 我在第280行之前添加此代码

while(bytes.hasRemaining())

客户端发送〜9900 ccr,但是非常慢。我在用c ++编写的其他直径服务器上测试了客户端,客户端(在不更改我的jdiameter上)发送了〜7000 ccr,但是此服务器托管在debian上。

我不知道解决此问题的方法,谢谢您的帮助。

如果发送方的发送返回零,则意味着发送方的套接字发送缓冲区已满,这又意味着接收方的套接字接收缓冲区已满,这又意味着接收方的读取速度慢于发送方的发送速度。

因此,加快接收速度。

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

  1. 取消注册OP_READ的通道并将其注册为OP_WRITE
  2. 返回到选择循环。
  3. OP_WRITE触发时,再次执行写操作。 这次,如果它没有返回零,请注销OP_WRITE ,然后(可能根据您的要求)注册OP_READ

请注意,始终不为OP_WRITE注册通道也是不正确的。 套接字通道几乎总是可写的,这意味着套接字发送缓冲区中几乎总是有空间。 什么你感兴趣的不是 -writable和可写的transistion。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM