Nodejs node-websocket-server 在 chrome 下出现错误

Nodejs node-websocket-server 在 chrome 下出现错误

各位大神~求教在chrome下使用 node-websocket-server报错是什么情况,貌似是协议草案的问题? enter image description here

9 回复

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>

解决方法

  1. 确保服务器和客户端使用相同的 WebSocket 协议版本。例如,如果服务器接受特定的子协议(如 'echo-protocol'),客户端也必须指定该子协议。
  2. 检查服务器的 originIsAllowed 函数,确保它允许来自浏览器的连接。
  3. 确保服务器正确处理 HTTP 请求,并返回正确的响应头。

希望这些信息能帮助你解决这个问题!如果你有其他疑问或需要进一步的帮助,请留言讨论。


这个模块更新怎么是一年之前啊…

是啊,我也发现了。 这个是一个教程上的,自己试了下

好的,谢谢。 貌似在safari下面就可以了

另外有个 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 架构,可以支持极高的并发量。

Chrome 的 WebSocket 接口不会再变了,RFC 6455 就是最终标准。

safari早6.0了~~~

从你的描述来看,你在使用 node-websocket-server 时遇到了一些问题,尤其是在 Chrome 浏览器中。node-websocket-server 这个库已经有些年头了,并且不再维护。建议使用更现代的 WebSocket 库,如 wssocket.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 服务器正在运行。如果仍然遇到问题,请检查控制台输出以获取更多错误信息。

回到顶部