我有一些Node.js代码,我一直在运行node.exe,看起来像这样:
// http://www.zhihua-lai.com/acm
// 09-Feb-2013
var sys = require('sys');
var net = require('net');
var sockets = [];
var svr = net.createServer(function(sock) {
sys.puts('Connected: ' + sock.remoteAddress + ':' + sock.remotePort);
sock.write('Hello ' + sock.remoteAddress + ':' + sock.remotePort + 'n');
sockets.push(sock);
sock.on('data', function(data) { // client writes message
if (data == 'exitn') {
sys.puts('exit command received: ' + sock.remoteAddress + ':' + sock.remotePort + 'n');
sock.destroy();
var idx = sockets.indexOf(sock);
if (idx != -1) {
delete sockets[idx];
}
return;
}
var len = sockets.length;
for (var i = 0; i < len; i ++) { // broad cast
if (sockets[i] != sock) {
if (sockets[i]) {
sockets[i].write(sock.remoteAddress + ':' + sock.remotePort + ':' + data);
}
}
}
});
sock.on('end', function() { // client disconnects
sys.puts('Disconnected: ' + data + data.remoteAddress + ':' + data.remotePort + 'n');
var idx = sockets.indexOf(sock);
if (idx != -1) {
delete sockets[idx];
}
});
});
var svraddr = '127.0.0.1';
var svrport = 8080;
svr.listen(svrport, svraddr);
sys.puts('Server Created at ' + svraddr + ':' + svrport + 'n');
一旦服务器运行,我就可以打开另外两个终端客户端并使用NetCat或telnet。当我在任何一个客户端窗口中输入信息时,信息都会广播到两个NetCat窗口。我遇到的问题是,当我试图创建一个JavaScript连接到服务器。
<!DOCTYPE html>
<html>
<head>
<title>sample</title>
<script type="text/javascript">
var connection = new WebSocket('ws://localhost:8080');
console.log(connection);
// When the connection is open, send some data to the server
connection.onopen = function () {
connection.send("a"); // Send the message 'Ping' to the server
console.log("send data...");
};
</script>
<body>
</body>
</html>
发生的是连接的readyState为0,表明Google chrome JavaScript无法打开到服务器的连接。我已经确保关闭了Windows防火墙以避免任何连接问题,并且服务器与NetCat一起工作正常。我想采取Nodejs进一步现在,让JavaScript连接到服务器,但我还不确定这将如何发生或什么需要改变与代码。
虽然websocket使用tcp/ip,但websocket服务器并不仅仅是标准的tcp服务器。
RFC6455定义了客户端和服务器必须使用的websocket协议。要打开连接,请参阅握手部分。要稍后发送/接收消息,请参阅数据帧部分。
你需要实现你自己的服务器来实现这个协议,或者找到一个你可以集成的现有的第三方服务器。如果您想考虑现有的服务器,ws看起来很有前途。