您的位置:首页 > Web前端 > Node.js

pomelo 框架一个session bug的修复

2016-09-09 20:56 393 查看
有一种情况发生会导致如下的错误发生。这种情况发生于客户端调试状态,socket还保持连接,但是没有维持心跳包,然后客户端突然断开,而服务端还不断的往这个session发送网络数据,导致发生异常

websocket send binary data failed: "Error: not opened\n    at WebSocket.send (D:\\project\\gameBilliards\\g

ame-server\\node_modules\\pomelo\\node_modules\\ws\\lib\\WebSocket.js:217:38)\n    at Socket.sendRaw (D:\\project\\gameB

illiards\\game-server\\node_modules\\pomelo\\lib\\connectors\\hybridsocket.js:65:15)\n    at Socket.send (D:\\project\\g

ameBilliards\\game-server\\node_modules\\pomelo\\lib\\connectors\\hybridsocket.js:84:8)\n    at Session.send (D:\\projec

t\\gameBilliards\\game-server\\node_modules\\pomelo\\lib\\common\\service\\sessionService.js:517:19)\n    at send (D:\\p

roject\\gameBilliards\\game-server\\node_modules\\pomelo\\lib\\common\\service\\sessionService.js:415:11)\n    at Sessio

nService.sendMessage (D:\\project\\gameBilliards\\game-server\\node_modules\\pomelo\\lib\\common\\service\\sessionServic

e.js:347:10)\n    at null.sendMessage (D:\\project\\gameBilliards\\game-server\\node_modules\\pomelo\\lib\\components\\s

ession.js:23:36)\n    at doBatchPush (D:\\project\\gameBilliards\\game-server\\node_modules\\pomelo\\lib\\pushSchedulers

\\direct.js:57:20)\n    at Service.schedule (D:\\project\\gameBilliards\\game-server\\node_modules\\pomelo\\lib\\pushSch

edulers\\direct.js:19:5)\n    at PushScheduler.schedule (D:\\project\\gameBilliards\\game-server\\node_modules\\pomelo\\

lib\\components\\pushScheduler.js:91:22)\n    at pro.send (D:\\project\\gameBilliards\\game-server\\node_modules\\pomelo

\\lib\\components\\connector.js:107:41)\n    at Remote.pushMessage (D:\\project\\gameBilliards\\game-server\\node_module

s\\pomelo\\lib\\common\\remote\\frontend\\channelRemote.js:49:13)\n    at pro.route (D:\\project\\gameBilliards\\game-se

rver\\node_modules\\pomelo\\node_modules\\pomelo-rpc\\lib\\rpc-server\\dispatcher.js:51:10)\n    at D:\\project\\gameBil

liards\\game-server\\node_modules\\pomelo\\node_modules\\pomelo-rpc\\lib\\rpc-server\\gateway.js:23:16\n    at processMs

g (D:\\project\\gameBilliards\\game-server\\node_modules\\pomelo\\node_modules\\pomelo-rpc\\lib\\rpc-server\\acceptors\\

ws-acceptor.js:134:15)\n    at Socket.<anonymous> (D:\\project\\gameBilliards\\game-server\\node_modules\\pomelo\\node_m

odules\\pomelo-rpc\\lib\\rpc-server\\acceptors\\ws-acceptor.js:53:11)\n    at emitOne (events.js:77:13)\n    at Socket.e

mit (events.js:169:7)\n    at SocketNamespace.handlePacket (D:\\project\\gameBilliards\\game-server\\node_modules\\pomel

o\\node_modules\\socket.io\\lib\\namespace.js:335:22)\n    at Manager.onClientMessage (D:\\project\\gameBilliards\\game-

server\\node_modules\\pomelo\\node_modules\\socket.io\\lib\\manager.js:488:38)\n    at WebSocket.Transport.onMessage (D:

\\project\\gameBilliards\\game-server\\node_modules\\pomelo\\node_modules\\socket.io\\lib\\transport.js:387:20)\n    at

Parser.<anonymous> (D:\\project\\gameBilliards\\game-server\\node_modules\\pomelo\\node_modules\\socket.io\\lib\\transpo

rts\\websocket\\hybi-16.js:39:10)"

修复这个bug如下,增加对socket状态的判断,如果socket在底层已经是失效的,则关闭之

代码路径为

D:\project\game\game-server\node_modules\pomelo\lib\common\service\sessionService.js

517行

Session.prototype.send = function(msg) {

    //add by ysj

    var WebSocket_OPEN=1;

    if(this.__socket__.socket.readyState!== WebSocket_OPEN)

    {

        console.log('519 socket error');

        this.closed('socket lost');

        //this.unbind(this.uid);

        return;

    }

  this.__socket__.send(msg);

};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息