使用NodeJS删除JavaScript中的websocket连接


                            #!/usr/bin/env node
                            var WebSocketServer = require('websocket').server;
                            var http = require('http');
                            var server = http.createServer(function(request, response) {
                                console.log((new Date()) + ' Received request for ' + request.url);
                                response.writeHead(404);
                                response.end();
                            });
                            server.listen(8080, function() {
                                console.log((new Date()) + ' Server is listening on port 8080');
                            });
                            wsServer = new WebSocketServer({
                                httpServer: server,
                                // You should not use autoAcceptConnections for production
                                // applications, as it defeats all standard cross-origin protection
                                // facilities built into the protocol and the browser.  You should
                                // *always* verify the connection's origin and decide whether or not
                                // to accept it.
                                autoAcceptConnections: false
                            });
                            function originIsAllowed(origin) {
                              // put logic here to detect whether the specified origin is allowed.
                              return true;
                            }
                            var jConnections = new Array();
                            wsServer.on('request', function(request) {
                                if (!originIsAllowed(request.origin)) {
                                  // Make sure we only accept requests from an allowed origin
                                  request.reject();
                                  console.log((new Date()) + ' Connection from origin ' + request.origin + ' rejected.');
                                  return;
                                }
                                var connection = request.accept('echo-protocol', request.origin);
                                var jConnectionIdentity = new Date();
                                jConnections.push(new Array(connection,jConnectionIdentity) );
                                //console.log("datestamp"+jConnections[0][1]);
                                console.log((new Date()) + ' Connection accepted.');
                                connection.on('message', function(message) {
                                    if (message.type === 'utf8') {
                                        console.log('Received Message: ' + message.utf8Data);
                                        //connection.sendUTF(message.utf8Data);
                                        for(var i=0;i<jConnections.length;i++)
                                        {
                                            var jConnection = jConnections[i][0];
                                            jConnection.sendUTF(message.utf8Data);
                                        }
                                    }
                                    else if (message.type === 'binary') {
                                        console.log('Received Binary Message of ' + message.binaryData.length + ' bytes');
                                        //connection.sendBytes(message.binaryData);
                                        for(var i=0;i<jConnections.length;i++)
                                        {
                                            var jConnection = jConnections[i][0];
                                            jConnection.sendBytes(message.binaryData);
                                        }
                                    }
                                });
                                connection.on('close', function(reasonCode, description) {
                                    for(var i=0;i<jConnections.length;i++)
                                    {   
                                        if(jConnections[i][1] == jConnectionIdentity)
                                        {
                                            delete jConnections[i];
                                            console.log((new Date()) + ' Peer ' + connection.remoteAddress + ' disconnected.');
                                            console.log(jConnections.length);
                                        }
                                    }
                                });
                            });

如果我打开3个客户端连接并从每个客户端发送消息,然后关闭第三个客户端,我看到"console.log(jConnections.length);"的输出仍然是3。关闭第三个客户端并从客户端2发送消息后,发生NodeJS崩溃。我的控制台输出如下所示:

                        C:Program Filesnodejs>node.exe workingexample3.js
                        Mon May 20 2013 16:30:14 GMT-0700 (Pacific Daylight Time) Server is listening on port 8080
                        Mon May 20 2013 16:30:18 GMT-0700 (Pacific Daylight Time) Connection accepted.
                        Mon May 20 2013 16:30:20 GMT-0700 (Pacific Daylight Time) Connection accepted.
                        Mon May 20 2013 16:30:22 GMT-0700 (Pacific Daylight Time) Connection accepted.
                        Received Message: client1
                        Received Message: client2
                        Received Message: client3
                        Mon May 20 2013 16:30:43 GMT-0700 (Pacific Daylight Time) Peer 127.0.0.1 disconnected.
                        3
                        Received Message: client2
                        C:Program Filesnodejsworkingexample3.js:48
                                                        var jConnection = jConnections[i][0];
                                                                                         ^
                        TypeError: Cannot read property '0' of undefined
                            at WebSocketConnection.<anonymous> (C:Program Filesnodejsworkingexample3.js:48:38)
                            at WebSocketConnection.EventEmitter.emit (events.js:95:17)
                            at WebSocketConnection.processFrame (C:Program Filesnodejsnode_moduleswebsocketlibWebSocketConnection.js:403:26)
                            at WebSocketConnection.handleSocketData (C:Program Filesnodejsnode_moduleswebsocketlibWebSocketConnection.js:247:14)
                            at Socket.EventEmitter.emit (events.js:95:17)
                            at Socket.<anonymous> (_stream_readable.js:736:14)
                            at Socket.EventEmitter.emit (events.js:92:17)
                            at emitReadable_ (_stream_readable.js:408:10)
                            at emitReadable (_stream_readable.js:404:5)
                            at readableAddChunk (_stream_readable.js:165:9)
                        C:Program Filesnodejs>

我希望在删除语句时jConnections的值。长度会减少1,但这似乎不会发生。因为我的三个客户端都是从localhost 127.0.0.1连接的,所以我必须想出一个计划,通过remoteaddress属性以外的东西来标识每个连接。这就是我在连接对象之外推入Date的原因。我希望通过创建日期来标识每个连接。

1)调用delete后,您的数组看起来像这样-

[[1, 1], [2, 2], undefined]

长度仍然是3:)

相关内容

  • 没有找到相关文章