websockets、express.js 无法建立与服务器的连接

Posted

技术标签:

【中文标题】websockets、express.js 无法建立与服务器的连接【英文标题】:websockets, express.js and can’t establish a connection to the server 【发布时间】:2017-02-26 18:54:12 【问题描述】:

这是WS 和express.js 上的简单聊天。我收到浏览器无法通过websockets 连接到服务器的错误。

客户端连接:

file: rtc.html 
ws = new WebSocket('wss://' + window.location.hostname + '/wr' );
ws.onerror = (error) =>  console.log(error); ;
ws.onmessage = (message) => 
   . . . 

服务器代码:

const express =   require('express');
const http =      require('http');
const WebSocket = require('ws');

const app = express();

app.get('/rtc', (req, res)=>
  res.sendFile('/home/user/dev/rtc.html');
);

const server = http.createServer(app);
const wss = new WebSocket.Server( server:server, path: "/wr" );

. . . 

app.listen(3000);

UPD:问题是因为我在webrtc 上聊天并在MozillaMozilla 进行测试,如果没有https 连接,getUserMedia 运行良好。 有必要这样写:

var https = require('https');
var serv = https.createServer(serverConfig, app);

【问题讨论】:

您使用的是哪个服务器端 webSocket 库? 那个:github.com/websockets/ws 【参考方案1】:

更改自:

app.listen(3000);

到:

server.listen(3000);

当您使用app.listen() 时,它会创建一个新的http 服务器,因此您连接socket.io 的服务器永远不会启动。要完全理解app.listen(),它的代码如下所示:

app.listen = function()
  var server = http.createServer(this);
  return server.listen.apply(server, arguments);
;

因此,您可以看到它正在创建一个与您附加 webSocket 服务器的 http 服务器不同的 http 服务器,因此另一个从未启动过。


或者,您也可以这样做:

const server = app.listen(3000);
const wss = new WebSocket.Server( server:server, path: "/wr" );

而且,根本不要创建自己的 http 服务器。 app.listen() 返回它创建的新服务器对象。

【讨论】:

我将:app.listen(3000); 替换为:server.listen(3000);,但仍无法连接 @alex10 - 然后你需要做一些故障排除/调试。在 Chrome 浏览器中,查看调试器中的网络选项卡,并准确查看加载页面时客户端发生的情况。特别是,您将寻找在 webSocket 上进行连接的尝试,并查看从中返回(或不返回)什么。如果您在加载页面时不知道如何在页面中打开 Chrome 调试器,那么请在 Google 上找到它,您应该会找到大量有关如何执行此操作的信息。您将希望网络选项卡能够查看您的 webSocket 连接发生了什么。 我找到了问题所在。写到最后,问题很奇怪。 你给出了正确的答案。我的问题是要提供更多详细信息。 谢谢!这正是我所缺少的:)【参考方案2】:

只要确保你使用 server.listen()。让代码自己说话

   var express         = require('express'),
     app             = express(),
     http            = require('http'),
     server          = http.createServer(app),
     WebSocketServer = require('ws').Server,
     wss             = new WebSocketServer( server );
 
 
 
 app.use(express.static(__dirname));
 
 server.listen(process.env.PORT || 3000, function ()   //
 console.log("Node server is running on http://localhost:3000/"); );
 
 wss.on('connection', function (ws) 
    //console.log("New connection.");
    ws.on('message', function (message) 
        //console.log("Message received:", message);
    );

【讨论】:

以上是关于websockets、express.js 无法建立与服务器的连接的主要内容,如果未能解决你的问题,请参考以下文章

laravel中的双向WebSockets?

如何在 express.js 中创建注册路由?

没有 express.js 的 Socket.io 会话?

从 node.js 和 websockets 访问 IPython 命令行

在 node.js 服务器上使用 nginx 时出现“websocket 连接无效”

无法在 LAN 网络上托管 Express.js 应用程序