NetEase / pomelo

A fast,scalable,distributed game server framework for Node.js.
http://pomelo.netease.com
MIT License
11.87k stars 2.9k forks source link

connectionService.js中的connCount(连接个数)远远大于已经登录的连接数(loginedCount)!! #680

Closed zj8487 closed 7 years ago

zj8487 commented 9 years ago

过程描述: 1,只有一个客户端,点击登录就会向服务器建立链接。 2,正常情况下,这时客户端应该调用entry进入connector,进行bind操作。这样就会出现一个链接一个登录了。

但是客户端点击多次。就会导致:前一个链接并没有进行bind操作。然后又建立了新链接。并在新链接上bind。这样就多出来了一个无用链接。

我做过测试,极端情况下不停的连续点击登录(导致建立链接,entry操作),会出现一个客户端情况下connCount是几十(如果继续点击,还会无限制增加),loginedCount为1.

建议修改方案 如果一个链接建立后N秒后不进行bind操作,就close这个链接 @py8765 @fantasyni

wuxian commented 9 years ago

开启心跳啊

wuxian commented 9 years ago

有个disconnectOnTimeout选项

zj8487 commented 9 years ago

这个应该不起作用吧。 我看了代码,链接建立成功就会进行握手。 如果有心跳协议,就会把相应的行为绑定到socket上。也就是说链接建立完成,客服端,服务器就会自动发送心跳。 @py8765 @fantasyni 麻烦看看

happychow commented 9 years ago

同意zj8487的说法, 线上项目总会累积一些没有bind的connection。

wuxian commented 9 years ago

开心跳应该不会了,POMELO一来做了心跳,二来有在连接建立后做一个如果在一定时间内不发包的话会主动断开连接

zj8487 commented 9 years ago

我测试了,开心跳仍然是那样。 我看了代码,链接建立成功就会进行握手。 如果有心跳协议,就会把相应的行为绑定到socket上。也就是说链接建立完成,客服端,服务器就会自动发送心跳。

也就是说,不管你bind没有,他都会发送心跳。

py8765 commented 9 years ago

connectionService里的connCount和logined是两个不同的统计,connCount是记录连接数,跟bind没有关系,logined才是统计bind的用户数量

zj8487 commented 9 years ago

@py8765 是这样的。现在的问题是:连接数远远大于bind的链接数啊 我就一个客户端,结果多了N条未绑定的链接

py8765 commented 9 years ago

你现在点击之后是一定有bind? 一个客户端也可能跟服务端有多条连接

zj8487 commented 9 years ago

@py8765 你现在点击之后是一定有bind? 这个不一定。

一个游戏客户端,理论上应该只有1个绑定的链接。 但是,出现一个客户端多个链接。其中只有一个bind了(调用了connector的entry进行绑定操作) 这原因是由于,建立链接和绑定是两步操作。 客户端可能会在bind前连续请求建立多个链接。

ghost commented 9 years ago

第一次连接的时候,如果没有bind,就主动断开连接,这样可以吗?

zj8487 commented 9 years ago

bind是客户端向服务器建立链接后,调用entry接口,在connector服务器实现bind的。 你建立链接后没有调用entry,是不会bind的。

这个时候,你断开,服务器(应用层)是感知不到的。 这个时候,你不断开,这个链接存在了,但是服务器(应用层)也是感知不到的。