【问题标题】:Websockets in NodeJS. Calling WebSocketServer from server-side WebSocket clientNodeJS 中的 Websocket。从服务器端 WebSocket 客户端调用 WebSocketServer
【发布时间】:2017-08-17 16:01:30
【问题描述】:

我有一个 NodeJS 网络应用程序正在运行。我有一个 WebSocketServer 正在运行。我可以通过客户端机器上的 javascript 建立的 WebSocket 连接与我的应用程序进行通信。这是相关的nodejs服务器端代码sn-p:

var WebSocket = require('ws');
var WebSocketServer = require('ws').Server;

var server = app.listen(process.env.VCAP_APP_PORT || 3000, function () {
    console.log('Server started on port: ' + server.address().port);
});

wss.on('connection', function (ws) {
    ws.on('message', function (message, flags) {
        if (flags.binary) {
            var value1 = message.readDoubleLE(0);
            var value2 = message.readInt16LE(8);
            var value3 = message.readInt8(10);

            //message.writeDoubleLE(8.5,0);

            ws.send(message, {
                binary: true
            });
        } else {
            if (message == "injest") {
                ws.send("requested: " + message);
            } else if (message == "something") {
                wss.clients[0].send('server side initiated call');
            } else {
                ws.send("received text: " + message);
            }
        }

    });

    // ws.send('something');    // Sent when connection opened.
});

所以你看,一切都很简单。

这是我的问题。如何从服务器端应用程序本身的 NodeJS 代码访问此 WebServer?

我尝试了以下方法:

var ws = new WebSocket("ws://localhost:443");

ws.on('message', function (message) {
    wss.clients[0].send('server side initiated call 1 ');
});

ws.on('close', function (code) {
    wss.clients[0].send('server side initiated call 2 ');
});

ws.on('error', function (error) {
    wss.clients[0].send(error.toString());
});

ws.send("k");

错误函数由 ECONNREFUSED 127.0.0.1:443 触发。

我在设置服务器时没有指定端口。如果我这样做了,那么从我的客户端 html 页面调用服务器失败。

简而言之,如何在 NodeJS 中设置 WebSocket 客户端以访问在该应用程序中创建的 WebSocketServer?

【问题讨论】:

  • 您能否为您的问题选择一个更有意义的标题?标签已经表明这是一个 node.js 和 webSocket 问题。您的标题应该为问题的内容提供一些背景信息。
  • 为什么要连接端口 443?您的服务器似乎在某个不同的端口上运行。您需要指定服务器实际运行的端口。而且,请记住,在连接到 localhost 时,连接不会通过您的托管服务提供商的任何基础设施(代理等),因此您必须连接到服务器进程正在运行的实际端口。
  • 感谢您的回答。正如我所说,我尝试为 websocket 服务器指定一个端口,但随后我的客户端调用停止工作。如何查询 WebSocketServer 对象以获取它正在运行的端口?此外,您是否希望该地址与我在客户端 javascript 中使用的地址相匹配,而不是本地主机,即类似 wss://mywebpaceaddress.whatever.endpoint 的地址?我试过了,但没有用。
  • 我猜您正在托管环境中运行,并且端口 80 上到您的域的传入连接映射到其他端口。当您直接连接到 localhost 时,不会发生该映射,因为您绕过了与您的域的连接所经过的正常基础设施。如果您想要该映射,请连接到您的域,而不是本地主机。
  • 感谢大家的建议。仍然无法让它工作。我已经简化了问题并重新发布,希望有人可以帮助我。

标签: node.js websocket


【解决方案1】:

不要使用localhost。用 127.0.0.1 代替它。

  1. 实例化服务器

let WebSocketServer = require("ws").Server; let ws = new WebSocketServer({port: 9090});

ws.on('connection', function (ws) {
    console.log(nHelp.chalk.red.bold('Server WebSocket was connected.'));

    //  Add the listener for that particular websocket connection instance.
    ws.on('message', function (data) {
       //code  goes here for what you need
 });

    ws.on('close', function () {
        console.log('websocket connection closed!');
    });

});

您可以在同一个文件中打开其他端口和路由(例如 Express),或者顺便说一下 WS 的其他端口。

以上不是用于 TLS 的 Secure WS 服务器的代码。这有点不同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-02
    • 1970-01-01
    • 2016-05-21
    相关资源
    最近更新 更多