WebSocket可以与HTTP模块一起使用,但无法与Express(Node.js框架)一起使用。

3
我正在试图使用express和websocket模块让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");
    })
})

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

1个回答

2

在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});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接