Nodejs node-websocket-server 在 chrome 下出现错误
Nodejs node-websocket-server 在 chrome 下出现错误
各位大神~求教在chrome下使用 node-websocket-server报错是什么情况,貌似是协议草案的问题?
Nodejs node-websocket-server 在 Chrome 下出现错误
各位大神,我最近在使用 node-websocket-server
库时遇到了一些问题。具体来说,在 Chrome 浏览器中运行时会遇到错误,看起来像是 WebSocket 协议草案版本不匹配的问题。
错误描述
在 Chrome 中打开页面后,控制台显示了以下错误信息:
WebSocket connection to 'ws://localhost:8080/' failed: Error during WebSocket handshake: Incorrect HTTP status code (400)
问题分析
错误信息表明在 WebSocket 握手过程中出现问题,HTTP 状态码为 400,这通常意味着请求格式不正确或服务器无法理解请求。
示例代码
让我们来看一下可能的代码示例:
服务器端代码(使用 node-websocket-server)
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,
autoAcceptConnections: false
});
function originIsAllowed(origin) {
return true; // 允许所有来源
}
wsServer.on('request', function(request) {
if (!originIsAllowed(request.origin)) {
request.reject();
console.log((new Date()) + ' Connection from origin ' + request.origin + ' rejected.');
return;
}
var connection = request.accept('echo-protocol', request.origin);
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);
}
});
connection.on('close', function(reasonCode, description) {
console.log((new Date()) + ' Peer ' + connection.remoteAddress + ' disconnected.');
});
});
客户端代码(HTML + JavaScript)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>WebSocket Test</title>
</head>
<body>
<script>
var ws = new WebSocket('ws://localhost:8080/');
ws.onopen = function() {
console.log('Connection opened');
ws.send('Hello Server!');
};
ws.onmessage = function(event) {
console.log('Message received:', event.data);
};
ws.onclose = function() {
console.log('Connection closed');
};
</script>
</body>
</html>
解决方法
- 确保服务器和客户端使用相同的 WebSocket 协议版本。例如,如果服务器接受特定的子协议(如
'echo-protocol'
),客户端也必须指定该子协议。 - 检查服务器的
originIsAllowed
函数,确保它允许来自浏览器的连接。 - 确保服务器正确处理 HTTP 请求,并返回正确的响应头。
希望这些信息能帮助你解决这个问题!如果你有其他疑问或需要进一步的帮助,请留言讨论。
这个模块更新怎么是一年之前啊…
是啊,我也发现了。 这个是一个教程上的,自己试了下
另外有个 ws
模块可以用的
Chrome 的 WebSocekt 协议是最正宗的,支持 RFC 6455,这是最新也是最终标准。
Safari 目前的最新版本是 5.1.7 ,支持的是之前的一个草案,叫做 hixie-76,这个草案其实已经废弃。苹果在 IOS6 里面的 Safari 是支持 RFC 6455 的。
Safari 的桌面版支持 RFC 6455 是迟早的事。
调试 WebSocket 建议以 Chrome 为标准,其兼容性是最好的。
如果想两种协议都支持,可以用“零秒”系统,其 Hctr 是同时支持 RFC 6455 和 hixie-76 的,而且采用 IOCP 架构,可以支持极高的并发量。
safari早6.0了~~~
从你的描述来看,你在使用 node-websocket-server
时遇到了一些问题,尤其是在 Chrome 浏览器中。node-websocket-server
这个库已经有些年头了,并且不再维护。建议使用更现代的 WebSocket 库,如 ws
或 socket.io
。
这里提供一个使用 ws
库的简单示例,展示如何在 Node.js 中设置 WebSocket 服务器,并确保其能在 Chrome 等浏览器中正常工作。
首先,安装 ws
库:
npm install ws
接下来,创建一个简单的 WebSocket 服务器:
const WebSocket = require('ws');
// 创建 WebSocket 服务器
const wss = new WebSocket.Server({ port: 8080 });
wss.on('connection', function connection(ws) {
console.log('A client connected.');
// 接收客户端消息
ws.on('message', function incoming(message) {
console.log('received: %s', message);
// 广播消息给所有连接的客户端
wss.clients.forEach(function each(client) {
if (client !== ws && client.readyState === WebSocket.OPEN) {
client.send(message);
}
});
});
// 当客户端断开连接时
ws.on('close', function() {
console.log('A client disconnected.');
});
});
console.log('WebSocket server is listening on port 8080.');
客户端代码(假设在 HTML 文件中):
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>WebSocket Example</title>
</head>
<body>
<script>
const ws = new WebSocket('ws://localhost:8080');
ws.onopen = () => {
console.log('Connected to the server');
ws.send('Hello, Server!');
};
ws.onmessage = (event) => {
console.log(`Message from server: ${event.data}`);
};
ws.onclose = () => {
console.log('Disconnected from the server');
};
</script>
</body>
</html>
这段代码创建了一个简单的 WebSocket 服务器,监听端口 8080。当客户端连接并发送消息时,服务器会将该消息广播给所有其他连接的客户端。
确保在 Chrome 浏览器中运行客户端代码,并且你的 Node.js 服务器正在运行。如果仍然遇到问题,请检查控制台输出以获取更多错误信息。