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方法,但是使用过程中遇到了到一定的时间连接必断开的问题,一方是发送数据异常,而一方是读取数据异常。有人能详细解释下这是为什么吗?

阅读 152
评论
    2 个回答
    • 169

    1.从你描述来看这个问题是是可能发生的,要吗可以传送数据,要吗不可以传送数据
    2.A点公网IP变化的可能性很小,通常情况下之后A点拥有公网IP的设备重启时IP才会改变
    3.对于你上述的业务需求,推荐使用web-socket实现 A点作为web-socket客户端,B点作为web-socket服务端,双方互相发送数据

      怎么不尝试在a和b建立一个隧道呢,linux是比较稳定的,windows尝试下来不太行,基本上每隔个吧小时就要重启下隧道

        撰写回答

        登录后参与交流、获取后续更新提醒