javascript - websocket 适用于 http 模块但不适用于 express (node.js)

标签 javascript node.js http express websocket

我正在尝试使用 express 和 websocket 模块使 websokects 与 node.js 一起工作。
有趣的是,如果我使用 http 模块创建服务器,它们会按预期工作,我会收到状态 101。
但是如果我使用 express 模块创建服务器,它会抛出一个错误:

WebSocket connection to 'ws://localhost:2345/' failed: Error in connection establishment: net::ERR_CONNECTION_REFUSED

这是代码

// using http module (works)
var WebSocketServer = require("websocket").server;
var http = require("http");

var app = http.createServer(function(request, response) {
    response.writeHeader(200, {'Content-Type':'text/html'});

    response.end(""+
    "<!DOCTYPE html>"+
    "<html>"+
        "<head>"+
            "<script>"+
                "var ws = new WebSocket('ws://localhost:2345/');"+
                "ws.onmessage = function(event) { "+
                "var span = document.createElement('span');"+
                "span.innerHTML = event.data;"+
                "document.body.appendChild(span);"+
                "}"+
            "</script>"+
        "</head>"+
        "<body>"+
            "<span>Messages: </span>"+
        "</body>"+
    "</html>"
    );
});

app.listen(2345);

wsServer = new WebSocketServer({'httpServer':app});

wsServer.on("request", function(request) {
    var connection = request.accept(null, request.origin);
    console.log("Connection ACCEPTED\n");

    connection.on("message", function(message)
    {
        if(message.type == 'utf8')
        {
            console.log("Received Message: %s", message.utf8Data);
            connection.sendUTF(message.utf8Data);
        }
    })

    connection.on("close", function(reasonCode, description)
    {
        console.log("Connection lost\n");
    })
})

和非工作部分

// using express module (get error)
var WebSocketServer = require("websocket").server;
var app = require('express')();

var app.get('/', function(request, response) {
    response.writeHeader(200, {'Content-Type':'text/html'});

    response.end(""+
    "<!DOCTYPE html>"+
    "<html>"+
        "<head>"+
            "<script>"+
                "var ws = new WebSocket('ws://localhost:2345/');"+
                "ws.onmessage = function(event) { "+
                "var span = document.createElement('span');"+
                "span.innerHTML = event.data;"+
                "document.body.appendChild(span);"+
                "}"+
            "</script>"+
        "</head>"+
        "<body>"+
            "<span>Messages: </span>"+
        "</body>"+
    "</html>"
    );
});

app.listen(2345);

wsServer = new WebSocketServer({'httpServer':app});

wsServer.on("request", function(request) {
    var connection = request.accept(null, request.origin);
    console.log("Connection ACCEPTED\n");

    connection.on("message", function(message)
    {
        if(message.type == 'utf8')
        {
            console.log("Received Message: %s", message.utf8Data);
            connection.sendUTF(message.utf8Data);
        }
    })

    connection.on("close", function(reasonCode, description)
    {
        console.log("Connection lost\n");
    })
})

那里可能有什么问题?如何解决这个问题?

最佳答案

Express 中的 app 不是 httpServer,所以如果 WebSocketServer 没有明确知道 Express 以及如何获取服务器从它,那么你可能需要给它实际的 httpServer 对象而不是 Express 对象,你可以通过改变这个来做到这一点:

app.listen(2345);
wsServer = new WebSocketServer({'httpServer':app});

为此:

var server = app.listen(2345);
var wsServer = new WebSocketServer({'httpServer': server});

关于javascript - websocket 适用于 http 模块但不适用于 express (node.js),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28526980/

相关文章:

javascript - 禁用向上和向下箭头滚动

node.js - MongoDB 与 Docker "failed to connect to server [localhost:27017] on first connect "

http - Cloudflare CDN 跨域请求

javascript - 使用议程安排电子邮件

javascript - 根据状态 react 重置选择选项

javascript - Bower 安装 > 类型错误 : msecs must be a number

http - HTTP 协议(protocol)中这些奇怪的行是什么?

javascript - 为什么这个 d3.text 请求失败了?

javascript - 使用 Javascript 在 WebView 中填写表单

node.js - 为什么 tsc 在泄漏传递实现类型时会给出如此神秘的错误?