Java的Socket长连接掉线问题!

Tomcat4 2010-08-11 05:28:12
大家好,我们现在做了一个基于校园网(一般的大学,大概3-4万人,网络环境很复杂)的电表数据采集系统,下位机客户端采用嵌入式的C写的Socket客户端,上位数据采集中心采用的Java的多线程、ServerSocket,因为要支持即时点播查询,所以必须采用长连接Socket模式,并采用了应用层心跳包(2分钟一次),现在大概有30个客户端。但是客户端掉线现象明显:
1.我们采用了断线重连技术,掉线3-5分钟能够自动重连,但是总觉得不是解决问题的最好办法;
2.有的客户端很稳定,1-2天掉一次,有的客户端一天掉8-10次

请问大家的意见,Socket长连接这样的掉线频率是否正常?我以前接触过基于互联网的移动CMPP的长连接也没有这么频繁的掉线啊,难道校园网比互联网还不稳定(校园网的负载很大,很多学生使用)?
另外,大家有没有从技术上改进的方法,减小断线率。暂时不考虑客户端C程序的问题!

谢谢大家!
...全文
1753 31 打赏 收藏 转发到动态 举报
写回复
用AI写文章
31 条回复
切换为时间正序
请发表友善的回复…
发表回复
jingle 2011-05-17
  • 打赏
  • 举报
回复
最近也要用这个 关注哈
haitao_kang 2011-03-03
  • 打赏
  • 举报
回复
我最近在用Mina做电表采集系统 qq250361141
bicel1222 2010-08-20
  • 打赏
  • 举报
回复
不知道楼主哪里掉线报什么异常?我这里掉线的话就是Connection reset,,估计是网络问题吧,
不知道缩小心跳包的时间能不能解决?
bicel1222 2010-08-20
  • 打赏
  • 举报
回复
我现在也在做基于GPRS的电表采集系统,在我这个项目中,掉线那就更平常了,而且还存在终端反复登录的现象。。。。
bicel@vip.qq.com 想向您交流学习。
bill_hai 2010-08-20
  • 打赏
  • 举报
回复
给你说下我的经验,我们公司现在也是做网络表的。
我们的下位机通过GPRS通信,心跳的目的是维持连接,如果没有心跳,在一段时间也没有发送数据,移动公司会关掉这个连接。
下位机一般都不稳定,所以掉线是正常的现象,必须采用掉新重连,而且尽量早重连,才能保证永久在线。
windforcecn 2010-08-20
  • 打赏
  • 举报
回复
是否是真正掉线?也许只是消息阻塞住等待中,你的判断掉线机制是什么?
Tomcat4 2010-08-17
  • 打赏
  • 举报
回复
自己顶,大家继续献言献策!
奋斗并快乐着 2010-08-13
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 tomcat4 的回复:]
引用 16 楼 zyongsheng83 的回复:

以前做过c/s的,java服务器flex客户端,在服务器和客户端不在同一个网上(一个在网通,一个在电信)的时候出现频繁掉线,调试发现如果两次的消息内容完全相同接收方就不接收第二次的内容,依次类推导致心跳功能不起作用,后来在每次消息后便加了时间戳致使相邻两次的消息不一样就没有再出现问题,就没再管。

(以上说法属实但没有任何理论依据,可能……
[/Quote]

无操作的话 几分钟就断
Kanepan 2010-08-13
  • 打赏
  • 举报
回复
回楼上 linux下用
netstat -ant | grep :80 | awk '{print $6}' | sort | uniq -c
80是端口号,改成你用的端口
骑猪去东莞 2010-08-12
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 sggsg 的回复:]

关注!!

最近也要用到socket,正在研究mina
[/Quote]
共同学习
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 dave_luo 的回复:]

先得分析下,是什么原因掉线。
既然有了心跳机制,那么断了就重连。
另外注意下,在交易的过程中会断线导致交易不成功吗?如果是得引起注意。
[/Quote]

当监测到掉线正在重连时,所有的交易都必须通过同步锁将他们全部阻塞住,等重连完成后才能释放。
  • 打赏
  • 举报
回复
一天掉 8 到 10 次那肯定不正常的。需要查清楚具体的掉线原因。

如果网络较稳定的话,可以一周不掉线。
szaiguoguo 2010-08-12
  • 打赏
  • 举报
回复
引起掉线的可能性有很多,主要是网络,一次针对该端口的网络广播就可以引起socket掉线,如果网络和校园网混在一起,随便哪个学生电脑中个病毒不停广播,你的系统就完蛋了
建议从网络入手,把该应用放在一个特定的虚拟网络里,和学生的网络隔开
fbbobo 2010-08-12
  • 打赏
  • 举报
回复
心跳设置的频率快一些,短线即重连。这样实时查询也就可以了。
Tomcat4 2010-08-12
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 yuwenbao 的回复:]

看下服务器你们连接的端口是否出现大量的time_wait或者close_wati现象
[/Quote]

请问,这个如何看?
Tomcat4 2010-08-12
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 zyongsheng83 的回复:]

以前做过c/s的,java服务器flex客户端,在服务器和客户端不在同一个网上(一个在网通,一个在电信)的时候出现频繁掉线,调试发现如果两次的消息内容完全相同接收方就不接收第二次的内容,依次类推导致心跳功能不起作用,后来在每次消息后便加了时间戳致使相邻两次的消息不一样就没有再出现问题,就没再管。

(以上说法属实但没有任何理论依据,可能是偶然/碰巧。。。)
[/Quote]

兄弟,“在服务器和客户端不在同一个网上(一个在网通,一个在电信)的时候出现频繁掉线”,你的频繁掉线时什么样的频率,一个小时一次,还是几分钟一次?
DAVE_LUO 2010-08-12
  • 打赏
  • 举报
回复
先得分析下,是什么原因掉线。
既然有了心跳机制,那么断了就重连。
另外注意下,在交易的过程中会断线导致交易不成功吗?如果是得引起注意。
Tomcat4 2010-08-12
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 lxpstart 的回复:]

对于socket,我的感觉就是能不做长连接就不做长连接,建议改成客服端定时发起,交换数据完了就马上关闭连接。
把服务端向客户端查询改成客户端定时报告比较可取。
[/Quote]

这个问题因为:
1.需求有即时查询下位机的功能,二下位机没有做服务端的功能,所以必须要长连接;
2.目前已经装了30余台下位机了,不太好更新程序
szaiguoguo 2010-08-12
  • 打赏
  • 举报
回复
对于socket,我的感觉就是能不做长连接就不做长连接,建议改成客服端定时发起,交换数据完了就马上关闭连接。
把服务端向客户端查询改成客户端定时报告比较可取。
钱不是问题 2010-08-12
  • 打赏
  • 举报
回复
关注!!

最近也要用到socket,正在研究mina
加载更多回复(10)

62,612

社区成员

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

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