我目前正在尝试使用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
。在聊天服务器代码中,我有一个循环记录当前客户端的数量,因此我知道浏览器已连接。
不知道从这里去哪里,任何帮助将非常感激。
亚历克斯当您执行webSocket.send('some data')
时,必须建立套接字连接,或者确切地说是套接字。readyState == 1.
你可以在这里查看websocket事件。为了确保这种情况永远不会发生,您应该在连接打开后发送,使用Socket.onopen
事件处理程序。你可以这样做。
if(webSocket.readyState == 1){
webSocket.send('some data');
}
else{
webSocket.onopen = function(e){
webSocket.send('some data');
}
}