2

我目前正在尝试使用 node.js 开发一个小型聊天应用程序。这是我的第一个节点项目,但我遇到了一个错误,我不确定如何解决它。

我在下面的节点中编写了一个简单的聊天服务器。

var port = 3000;
var net = require('net');
var clients = [];

var server = net.createServer(function (socket) {
  clients.push(socket);
  bindEventHandlers(socket);
});

setInterval(function(){
  console.log(clients.length);
}, 2000);

server.listen(port);
console.log('Server is listening on localhost:' + port);

function bindEventHandlers(socket) {
  socket.on('data', function(data){
    broadcastDataToAllClient(data, socket);
  });
  socket.on('close', function(){
    clients.splice(clients.indexOf(socket), 1);
  });
  socket.on('error', function(){
    console.log('Known Error << "It\'s a feature!"');
  })
}

function broadcastDataToAllClient(data, socket) {
  for (var client in clients) {
      if(clients[client] == socket){ continue; }
      clients[client].write(data);
  }
}

和一个快速的客户端界面

<!DOCTYPE HTML>
<html>
    <head>
        <title>Node.js Chat Server</title>
        <script type="text/javascript">
            function init(){
                if (window.WebSocket) {
                    var input = document.getElementById('messageBox');
                    var webSocket = new WebSocket("ws://localhost:3000/");
                    input.onkeyup = function(e){
                        if(e.keyCode == 13) {
                            console.log('sending message');
                            webSocket.send('some data');
                        }
                    };
                    webSocket.onopen = function(e){
                        alert('Open');
                    }
                    webSocket.onmessage = function(e){
                        console.log('Message');
                    }
                    webSocket.onclose = function(e){
                        console.log('Close');
                    }
                    webSocket.onerror = function(e){
                        console.log('Error');
                    }   
                } else {
                    console.log('unable to support :(');
                }
            }
        </script>
    </head>
    <body lang="en" onload="init();">
        <h1>Node.js Chat Server</h1>
        <h3>Welcome to this simple chat server!</h3>
        <input id="messageBox" size="50" />
    </body>
</html>

当我打电话给webSocket.send('some data')我收到这个错误Error: InvalidStateError: DOM Exception 11。在聊天服务器代码中,我有一个循环记录当前客户端的数量,因此我知道浏览器已连接。

不知道从这里去哪里,任何帮助将不胜感激。

亚历克斯

4

1 回答 1

7

当您这样做时webSocket.send('some data'),必须建立套接字连接,或者特别是 socket.readyState == 1。

您可以在此处查看 websocket 事件。为了确保这永远不会发生,您应该在连接打开后使用Socket.onopen事件处理程序发送。你可以这样做。

if(webSocket.readyState == 1){
    webSocket.send('some data');
  }
else{
    webSocket.onopen = function(e){
        webSocket.send('some data');
    }
}
于 2013-05-04T16:41:22.287 回答