哎,又来问了,其实我的程序已经基本上好了,但是就剩这个问题了。
暂时用我家的电脑做serversocket端,但是我家的ip过两天一般就会电信给变一下。目前用了一个治标的办法,用花生壳,将客户端连接的socket指定host域名。
但昨天下午出现了这样的事:我的server端程序自己关闭了。为什么我会知道,因为之前就出现过类似问题,所以我写了一个.bat守护,定期检测,检测到服务器进程没了,就再启动服务器,并显示启动的时间。昨天重启的时间是14:39。15点多的时候我自己试用单位的电脑连接了一下我的服务器,是正常的,也是我没去早连接测试,没实时发现这个问题。
由于晚上回去看了一下我电脑的IP,发现变了,所以严重怀疑这次掉线是因为变IP。
查看服务器我自己留存的日志,发现是这样的。掉线前是有一个客户端连接的,客户端的最后一个心跳是在14:33的,5分钟没动静(由于我自己刚刚发现了服务器代码有BUG,忘了关联保活,所以服务器没自动踢掉客户端),14:38才有这个客户端的disconnect消息传来。
假如是在这个时段变IP的,缓冲了5分钟本身可以理解,花生壳更新IP解析需要时间嘛。但这里有若干问题:
1、clientsocket是指定域名连接的,在连接状态下,此域名的IP变了,socket是如何处理的?
2、如果socket在更换IP的瞬间就已经不能连接了,也就是这5分钟是tcp协议的超时时间,5分钟以后才出现disconnect。这里会触发onerror之类的事件吗?哪端触发?因为服务器应该是不知道自己IP变的(路由嘛,只是将本机的对应端口映射到外网IP上去,serversocket总是打开本机的端口,这里没错)
3、既然服务器应该不知道自己IP变,为什么会出现服务器整个程序被关闭的情况呢?有没有办法解决这个问题,依赖守护bat去重启服务器总不是个事吧?
4、理论上是否有能够彻底解决这个问题的方法?就是服务器能在自己的外网IP改变的瞬间,先截获这个事件,在原来的连接断掉之前把新IP广播到在线的客户端,重新建立连接?
暂时用我家的电脑做serversocket端,但是我家的ip过两天一般就会电信给变一下。目前用了一个治标的办法,用花生壳,将客户端连接的socket指定host域名。
但昨天下午出现了这样的事:我的server端程序自己关闭了。为什么我会知道,因为之前就出现过类似问题,所以我写了一个.bat守护,定期检测,检测到服务器进程没了,就再启动服务器,并显示启动的时间。昨天重启的时间是14:39。15点多的时候我自己试用单位的电脑连接了一下我的服务器,是正常的,也是我没去早连接测试,没实时发现这个问题。
由于晚上回去看了一下我电脑的IP,发现变了,所以严重怀疑这次掉线是因为变IP。
查看服务器我自己留存的日志,发现是这样的。掉线前是有一个客户端连接的,客户端的最后一个心跳是在14:33的,5分钟没动静(由于我自己刚刚发现了服务器代码有BUG,忘了关联保活,所以服务器没自动踢掉客户端),14:38才有这个客户端的disconnect消息传来。
假如是在这个时段变IP的,缓冲了5分钟本身可以理解,花生壳更新IP解析需要时间嘛。但这里有若干问题:
1、clientsocket是指定域名连接的,在连接状态下,此域名的IP变了,socket是如何处理的?
2、如果socket在更换IP的瞬间就已经不能连接了,也就是这5分钟是tcp协议的超时时间,5分钟以后才出现disconnect。这里会触发onerror之类的事件吗?哪端触发?因为服务器应该是不知道自己IP变的(路由嘛,只是将本机的对应端口映射到外网IP上去,serversocket总是打开本机的端口,这里没错)
3、既然服务器应该不知道自己IP变,为什么会出现服务器整个程序被关闭的情况呢?有没有办法解决这个问题,依赖守护bat去重启服务器总不是个事吧?
4、理论上是否有能够彻底解决这个问题的方法?就是服务器能在自己的外网IP改变的瞬间,先截获这个事件,在原来的连接断掉之前把新IP广播到在线的客户端,重新建立连接?
当然这方法有个不足的地方,就是如果客户端没有外网IP就会失败,本来正常情况下客户端不需要外网IP的