JAVA socket 优化传输效率!!《求助》高手快来

niejun111 2011-04-24 08:47:40
一个服务单 一个客户端

1.将服务器,和客户端都在本机上进行传输 很快
本机很快,1s可发几万次

2.将服务器放到 局域网内另一台 linux 机器,客户端放到windows 上进行发送的时候就很慢
将服务器放到 局域网内另一台 windows 机器,客户端放到windows 进行发送,发送效率一样慢



客户端:
while(true){

一次发送的数据为 (8+15)=23字节,write(23字节);
等服务端得响应 read(16字节);

}
服务端:
while(true){
接受,
然后返回 响应 12+4 = 16的字节

}

客户端发送23字节,循环发送1000次,用时 60s。

将socket TcpNodelay设置为true后效率有所提升
发送23字节,循环发送1000次,用时 3s。
settcpnodelay(true)

我定位影响效率的原因是 in.read()阻塞导致的.
settcpnodelay(flase)即默认情况下
每次read()耗时 202ms左右,write() 0ms
settcpnodelay(true)即禁用negal算法,
每次read()耗时 1ms 左右,write() 1-3ms左右
偶尔出现一次40ms的情况

请教各位大侠,该如何优化,网络传输,read阻塞的情况啊

是JVM虚拟机的对socket的网络发送,有限制??

小弟先在此谢过!!
...全文
724 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
niejun111 2011-04-25
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 leisore 的回复:]

想到两个思路:
1. 传统IO下设置Socket属性:
客户端:
setTcpNoDelay(true)
setReceiveBufferSize(16)
setSendBufferSize(23)
setKeepAlive(true)
setPerformancePreferences(1,2,0)

服务器:
setT……
[/Quote]

最新测试结果..

settcpnodelay(flase)
情况下
在一次发送 1536字节 获取响应70字节 循环一1000。。只需1500ms左右
在发送<1500字节的时候 获取响应70字节 循环一1000。。竟然达到 41000ms左右

[点击查看原始大小图片]

settcpnodelay(true)
情况下
在一次发送 1536字节 获取响应70字节 循环一1000。。只需1500ms左右
在发送<1500字节的时候 获取响应70字节 循环一1000。。只需800ms左右
http://dl.iteye.com/upload/attachment/470268/87957deb-bbf0-36e7-81bc-8479984bc615.jpg
niejun111 2011-04-25
  • 打赏
  • 举报
回复
[Quote=引用楼主 niejun111 的回复:]
一个服务单 一个客户端

1.将服务器,和客户端都在本机上进行传输 很快
本机很快,1s可发几万次

2.将服务器放到 局域网内另一台 linux 机器,客户端放到windows 上进行发送的时候就很慢
将服务器放到 局域网内另一台 windows 机器,客户端放到windows 进行发送,发送效率一样慢



客户端:
while(true){

一次发送的数据为……
[/Quote]

最新测试结果

最新测试结果..

settcpnodelay(flase)
情况下
在一次发送 1536字节 获取响应70字节 循环一1000。。只需1500ms左右
在发送<1500字节的时候 获取响应70字节 循环一1000。。竟然达到 41000ms左右

[点击查看原始大小图片]

settcpnodelay(true)
情况下
在一次发送 1536字节 获取响应70字节 循环一1000。。只需1500ms左右
在发送<1500字节的时候 获取响应70字节 循环一1000。。只需800ms左右

niejun111 2011-04-25
  • 打赏
  • 举报
回复
好的,不好意思!来晚了! 昨天也是没有环境...只能今天弄了

待会就把测试结果贴上来
niejun111 2011-04-25
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 clarck_913 的回复:]

楼主这不对啊,怎么还带广告啊

代码也木有给我们诶

叼胃口叼胃口.......
[/Quote]

怎么可能有广告!!
clarck_913 2011-04-25
  • 打赏
  • 举报
回复
楼主这不对啊,怎么还带广告啊

代码也木有给我们诶

叼胃口叼胃口.......
leisore 2011-04-24
  • 打赏
  • 举报
回复
想到两个思路:
1. 传统IO下设置Socket属性:
客户端:
setTcpNoDelay(true)
setReceiveBufferSize(16)
setSendBufferSize(23)
setKeepAlive(true)
setPerformancePreferences(1,2,0)

服务器:
setTcpNoDelay(true)
setReceiveBufferSize(23)
setSendBufferSize(16)
setKeepAlive(true)
setPerformancePreferences(1,2,0)

2. 使用NIO

lz可以试一下,但是请把最后的结果贴出来哈,我这儿没有环境,只有一台本本

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧