我需要创建一个基于与 websocket.org 上的 echo 服务器相同逻辑的服务器。 不同之处在于,服务器不会准确回显用户输入的内容,而是会返回随接收到的字符串而变化的响应。
我找了一个多星期,只找到了n个仅解释客户端的例子,其中一些包括不应答wss://调用的服务器的例子。 我发现的所有内容仅响应调用 http://192.168.1.1:3000 或 https://192.168.1.1:3000,但是当我使用 wss: //192.168.1.1:3000 时,Firefox 说,它是无法与wss服务器建立连接://192.168.1.1:3000/。 当我调用 wss 时客户端工作://echo.websocket.org/.
在哪里可以找到响应 wss 的 echo 服务器的代码?
上面我列出了我在github上找到的代码。我正在尝试的nodejs服务器代码是:
const http = require('http');
const ws = require('ws');
const wss = new ws.Server({noServer: true});
console.log("Script has started");
if (!module.parent) {
console.log("Listening on port 3000");
http.createServer(accept).listen(3000);
} else {
exports.accept = accept;
}
function accept(req, res) {
console.log("accept event started");
// all incoming requests must be websockets
if (!req.headers.upgrade || req.headers.upgrade.toLowerCase() != 'websocket') {
console.log("This is no websocket!!! Return");
res.end();
return;
}
// can be Connection: keep-alive, Upgrade
if (!req.headers.connection.match(/\bupgrade\b/i)) {
res.end();
return;
}
console.log("Handle upgrade");
wss.handleUpgrade(req, req.socket, Buffer.alloc(0), onConnect);
}
function onConnect(ws) {
console.log("onConnect event started");
ws.on('message', function (message) {
let name = message.match(/([\p{Alpha}\p{M}\p{Nd}\p{Pc}\p{Join_C}]+)$/gu) || "Guest";
console.log("Send Hello");
ws.send(`Hello from server, ${name}!`);
setTimeout(() => ws.close(1000, "Bye!"), 5000);
});
}
如果我使用 http://192.168.1.1: 3000/
调用服务器,此代码会响应“这不是 websocket!!!返回”提前谢谢您。
过了一会儿我找到了解决方案:
// Basic Websocket (ws) echo server
const WebSocket = require('ws');
const ws_server = new WebSocket.Server({ port: 81 });
ws_server.on('connection', function connection(ws) {
console.log("A client connected");
ws.on('message', function incoming(message) {
ws.send('Hi, you sent me ' + message);
});
});
这适用于我的测试。