Java Socket连接的问题
我有一个客户的项目需要访问他们内网的服务,但又要接受互联网的回调,因此部署了两套,一套在他们的内网服务器上,使用192.168.x.x的IP(简称A点),但是能访问外网,另一台则部署在阿里云上面,有固定的IP(简称B点),两个服务通过socket进行通信,由A点主动连接B点,并且B点在有客户端连接之后,就不再接受其它的客户端连接。但是有一个问题是A点可能用的是普通电信宽带网络,外部IP是动态的,随时都有可能改变,就导致和B点的通信不稳定,当然外部IP变化的时候A点会断开连接捕获异常进行重连,但是B点就一直没有异常抛出,通常要等十多分钟到半小时左右,才会有一个连接超时的异常抛出,因此A点常常不能在断开后立即连接上B点,我在B点上有心跳探测,每隔30秒就会给A点发送一次数据,以保持连接不断,在A点的对外IP变了之后,B点仍然能“正常”发送心跳,不会有任何异常抛出。
我就觉得很奇怪,为什么A点能捕获连接异常,但是B点就没有问题,关键是断开后还能正常发送数据,TCP发包不是要判断对方收到没有吗?没收到就会重新发包,但是为什么B点能一直发送客户端收不到的包呢?
另外最早在网上看到发送心跳使用sendUrgentData方法,但是使用过程中遇到了到一定的时间连接必断开的问题,一方是发送数据异常,而一方是读取数据异常。有人能详细解释下这是为什么吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
1.从你描述来看这个问题是是可能发生的,要吗可以传送数据,要吗不可以传送数据
2.A点公网IP变化的可能性很小,通常情况下之后A点拥有公网IP的设备重启时IP才会改变
3.对于你上述的业务需求,推荐使用web-socket实现 A点作为web-socket客户端,B点作为web-socket服务端,双方互相发送数据
怎么不尝试在a和b建立一个隧道呢,linux是比较稳定的,windows尝试下来不太行,基本上每隔个吧小时就要重启下隧道