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編程一定要先判斷端口,切記!