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

这是WSexpress.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);

【问题讨论】:

标签: javascript node.js express websocket


【解决方案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);
    });

【讨论】:

    猜你喜欢
    • 2019-02-03
    • 2020-04-06
    • 2012-10-17
    • 1970-01-01
    • 1970-01-01
    • 2019-06-21
    • 2021-07-18
    • 2018-08-09
    • 1970-01-01
    相关资源
    最近更新 更多