WebSocket is closed before the connection is established
最近socket.io是挺流行的,幼麟棋牌和一些好的开源项目也使用这个框架,在搭建其平台示例的出现这个错误,网上找了半天竟然没有找到解决办法,开始以为是版本socket.io版本问题,换了2.0一样,用telnet连接端口正常,但是客户端怎么都连接不上。
逐步进行分析,发现socket.io是非堵塞设计,竟然不判断端口已经打开,而且也没有输出对应log。这个和平时编程完全不同 。 因此,大家要注意了,不管你用listen还是初始化构造那里,你的端口被占用了,也不会导致异常,因此开发代码一定要做检测端口。
socket.io 打开的代码
Socket.prototype.open = Socket.prototype.connect = function () { if (this.connected) return this; this.subEvents(); this.io.open(); // ensure open if ('open' === this.io.readyState) this.onopen(); this.emit('connecting'); return this; };
不是自己打开端口是这样readyState='opening',但是代码里面没处理,依然有返回。
幼麟棋牌用的是10000端口号,大家都觉得10000端口号,谁会去占用,开始一直没往这方面想,但是迅雷的服务ThunderPlatform.exe是占用10000端口的,呵呵,问题出来了,把ThunderPlatform.exe进程结束掉重启我们的程序就一切OK。
基本可以确定目前在socket.io编程一定要先判断端口,切记!