1
                            #!/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);”的输出 还是三个。在关闭第三个客户端并从客户端 2 发送消息后,发生 NodeJS 崩溃。我的控制台输出如下所示:

                        C:\Program Files\nodejs>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 Files\nodejs\workingexample3.js:48
                                                        var jConnection = jConnections[i][0];
                                                                                         ^
                        TypeError: Cannot read property '0' of undefined
                            at WebSocketConnection.<anonymous> (C:\Program Files\nodejs\workingexample3.js:48:38)
                            at WebSocketConnection.EventEmitter.emit (events.js:95:17)
                            at WebSocketConnection.processFrame (C:\Program Files\nodejs\node_modules\websocket\lib\WebSocketConnection.js:403:26)
                            at WebSocketConnection.handleSocketData (C:\Program Files\nodejs\node_modules\websocket\lib\WebSocketConnection.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 Files\nodejs>

我希望在 delete 语句中 jConnections.length 的值会减一,但这似乎并没有发生。由于我的三个客户端都是从 localhost 127.0.0.1 连接的,因此我必须制定一个计划,以通过 remoteAdress 属性以外的方式识别每个连接。这就是为什么除了连接对象之外我还要推送一个日期。我希望通过创建日期来识别每个连接。

4

1 回答 1

2

1)调用删除后,您的数组如下所示 -

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

长度仍然是 3 :)

于 2013-05-21T23:12:14.727 回答