为什么我的websocket几分钟后关闭?

乔伊·卡森

我在服务器端使用ws与node.js,在客户端使用常规WebSocket API。来回打开连接和消息几次都可以。但是,插座总是在一两分钟后关闭。他们不应该坚持吗?难道我做错了什么?

我的服务器是在heroku上托管的node.js。我只是使用foreman start(使用heroku工具在本地运行服务器)再次在本地进行了测试,并且套接字根本没有意外关闭,所以也许这是对heroku的错误配置。无论如何,这是一个相关的代码示例,为简洁起见,省略了一些功能。

我正在OSX Yosemite的Chrome中测试该应用程序,但是在针对生产环境运行时,在Windows 7的Chrome中看到了相同的行为。

服务器:

// Client <-> Host Protocol functions.  Move to a different file so that they can be shared.
var C2H_SIGNAL_TYPE_REGISTER = "register";

var H2C_SIGNAL_WELCOME = "welcome";
var H2C_SIGNAL_TYPE_ERROR = "error";
var H2C_SIGNAL_TYPE_PEER_ADDED = "peer_joined";
var H2C_SIGNAL_TYPE_PEER_LEFT = "peer_left";

// Update channel endpoint names.
var UPDATE_ENDPOINT_PEERS = "/peers";

// Create a signal message with all asociated default properties.
// Signal senders should create this object and update it accordingly when
// building a signal message to send to a peer.
function createHostMsg(type)
{
    var msg = { signalType: type };

    if ( type == H2C_SIGNAL_WELCOME ) {
        // Since we're sending a welcome message, we need to provide a list
        // of currently connected clients.
        msg.peers = {};
        for ( var addr in clients ) {
            console.log("addr " + addr);
            var c = clients[addr].description;
            if ( c && c.id ) {
                msg.peers[c.id] = c;
            }
        }
    }

    return msg;
}

// require modules. 
var express = require('express');
var http = require('http');
var bodyParser = require('body-parser');
var multer = require('multer');

// Tracks connected peers.
var clients = { };

// 1.  Configure the application context settings.
var app = express();
app.enable('trust proxy');
app.use(express.static(__dirname + '/public'));
app.use(bodyParser.json()); // parse json
app.use(bodyParser.urlencoded({ extended: true })); // for parsing application/x-www-form-urlencoded
app.use(multer()); // for parsing multipart/form-data

// a. configure http routers.  these will handle requests coming from app.
app.set('port', (process.env.PORT || 5000));
app.get('/app', peerApp);
app.get('/script/:name', publicScriptRouter);

// 2.  Create the http server itself, passing app to be the request handler.
// app will handle routing and multiplexing of incoming requests to different
// route middleware handlers.
var http = require('http');
var WebSocketServer = require("ws").Server
var httpServer = http.createServer(app);
httpServer.listen( app.get('port') );

// 3.  Create one of these for all socket endpoints.
var wss = new WebSocketServer( { server: httpServer, path: UPDATE_ENDPOINT_PEERS } );

wss.on("connection", function(webSocket) {

    // 1.  Associate the socket with the remote address it came from.
    var remoteAddress = webSocket._socket.remoteAddress;
    var remotePort = webSocket._socket.remotePort;
    var clientConnID = remoteAddress + ":" + remotePort;

    var exists = clients[clientConnID] != null;
    if ( exists ) {
        console.log("socket server connection: associating new connection from %s with registered peer.", clientConnID);
        clients[clientConnID].socket = webSocket;
    } else {
        console.log("socket server connection: associating new connection from %s with unregistered peer.", clientConnID);
        clients[clientConnID] = { description: null, socket: webSocket };
    }   

    // 2.  Hook up handlers for communication over this particular socket.
    webSocket.on("message", function(data, flags) {
        processMessage(webSocket, data, flags);
    });

    webSocket.on("close", function() {
        // Praise satin for closures!!
        removePeer(clientConnID);
    });

});

// Transduce the message and handle it accordingly.
function processMessage(socket, data, flags)
{
    var msg = JSON.parse(data);
    if ( !msg.signalType ) {

        var msg = createHostMsg( H2C_SIGNAL_TYPE_ERROR );
        msg.errStr = "message_malformed";
        socket.send( JSON.stringify( msg ) );

    } else if ( msg.signalType == C2H_SIGNAL_TYPE_REGISTER ) {
        handleRegistration(socket, msg);
    }
}

客户:

function initSignalChannel()
{
    rtcPeer.channel = new WebSocket( location.origin.replace(/^http/, 'ws') + "/peers" );
    rtcPeer.channel.onmessage = updateChannelMessage;
    rtcPeer.channel.onopen = function(event) { 
        console.log("remote socket opened");
    }
    rtcPeer.channel.onclose = function(event) {
        console.log("host closed remote socket.");
    }
}

function updateChannelMessage(event) {

    var msgObj = JSON.parse(event.data);

    if ( !msgObj || !msgObj.signalType ) {

        console.log("updateChannelMessage: malformed response!! %o", msgObj );

    } else if ( msgObj.signalType == "welcome" ) {

        console.log("updateChannelMessage: received welcome from host.");
        handleWelcome(msgObj);

    } else if ( msgObj.signalType == "peer_joined" ) {
        console.log("updateChannelMessage: received peer_joined from host.");
        if ( msgObj.peer.id == rtcPeer.description.id ) {
            console.log("updateChannelMessage: peer_joined: received notification that I've been added to the room. " + msgObj.peer.id);
            console.log(msgObj);
        } else {
            console.log("updateChannelMessage: peer_joined: peer %s is now online.", msgObj.peer.id);
            console.log(msgObj);
            addRemotePeer( msgObj.peer );
        }
    }

}

function addRemotePeer(peerObj)
{
    remotePeers[peerObj.id] = peerObj;
    var ui = createPeerUIObj(peerObj);
    $("#connectedPeerList").append( ui );
}

function createPeerUIObj(peerObj)
{
    var ui = null;
    if ( peerObj ) {
        ui = $("<li></li>");
        var a = $("<a></a>");

        a.append("peer " + peerObj.id);
        ui.append(a);
        ui.click(function(event) { console.log("clicked");});
    }

    return ui;
}

function handleWelcome(msgObj)
{
    if ( msgObj.id ) {

        console.log("updateChannelMessage: welcome: received id from host. " + msgObj.id);
        console.log(msgObj);
        rtcPeer.description.id = msgObj.id;

        for ( var p in msgObj.peers ) {
            addRemotePeer(msgObj.peers[p]);
        }

    } else {
        console.log("updateChannelMessage: malformed response.  no id.");
    }
}
乔伊·卡森

谢谢大家的评论。事实证明jfriend00的答案正确,我只是没有意识到我所使用的托管服务不允许打开连接。

从下面的论坛帖子中,解决方案是

您需要让您的客户端定期对服务器执行ping操作,以使套接字保持活动状态。

不是最理想的情况,但确实可行。感谢您指出正确的方向。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么几分钟后我的计算机随机关闭?

来自分类Dev

nohup 进程在终端关闭几分钟后停止运行

来自分类Dev

为什么每隔几分钟Nlog存档文件?

来自分类Dev

为什么 SpringBoot 网站在 Jmeter 负载测试开始几分钟后拒绝客户端连接?

来自分类Dev

几分钟后OnDemand WebJob失败

来自分类Dev

几分钟后Genymotion崩溃

来自分类Dev

OSX:几分钟后dd退出

来自分类Dev

几分钟后Genymotion崩溃

来自分类Dev

PulseAudio 在使用几分钟后崩溃

来自分类Dev

Ubuntu 在启动几分钟后崩溃

来自分类Dev

监视器在几分钟后关闭电源,坐下,然后重新启动

来自分类Dev

新电脑在使用几分钟后关闭。重新打开电源。电源?

来自分类Dev

启动后,我的电脑挂了几分钟,然后就可以了

来自分类Dev

为什么程序和功能要花几分钟才能填充?

来自分类Dev

程序死后,为什么最多需要几分钟来清理侦听的TCP端口?

来自分类Dev

为什么大型文件传输在几分钟后会以99%的速度停止?

来自分类Dev

为什么几分钟后用户不再是活动目录组的成员?

来自分类Dev

为什么在查询中添加WHERE语句(在具有索引的列上)会使我的运行时间从几秒钟增加到几分钟?

来自分类Dev

为什么在查询中添加WHERE语句(在带有索引的列上)会使我的运行时间从几秒钟增加到几分钟?

来自分类Dev

如果在此期间发出请求,服务器仅在几分钟后关闭

来自分类Dev

Xcode 5.0挂起链接-几分钟后失败

来自分类Dev

几分钟后,Google Analytics(分析)将失去跟踪

来自分类Dev

几分钟后清除工作流程

来自分类Dev

几分钟后清除工作流程

来自分类Dev

几分钟后,蓝牙保持“挂起”状态

来自分类Dev

播放mp3几分钟后,MediaPlayer静音

来自分类Dev

几分钟后,Internet停止工作

来自分类Dev

几分钟后声音停止工作了吗?

来自分类Dev

openVPN 在几分钟不活动后停止

Related 相关文章

  1. 1

    为什么几分钟后我的计算机随机关闭?

  2. 2

    nohup 进程在终端关闭几分钟后停止运行

  3. 3

    为什么每隔几分钟Nlog存档文件?

  4. 4

    为什么 SpringBoot 网站在 Jmeter 负载测试开始几分钟后拒绝客户端连接?

  5. 5

    几分钟后OnDemand WebJob失败

  6. 6

    几分钟后Genymotion崩溃

  7. 7

    OSX:几分钟后dd退出

  8. 8

    几分钟后Genymotion崩溃

  9. 9

    PulseAudio 在使用几分钟后崩溃

  10. 10

    Ubuntu 在启动几分钟后崩溃

  11. 11

    监视器在几分钟后关闭电源,坐下,然后重新启动

  12. 12

    新电脑在使用几分钟后关闭。重新打开电源。电源?

  13. 13

    启动后,我的电脑挂了几分钟,然后就可以了

  14. 14

    为什么程序和功能要花几分钟才能填充?

  15. 15

    程序死后,为什么最多需要几分钟来清理侦听的TCP端口?

  16. 16

    为什么大型文件传输在几分钟后会以99%的速度停止?

  17. 17

    为什么几分钟后用户不再是活动目录组的成员?

  18. 18

    为什么在查询中添加WHERE语句(在具有索引的列上)会使我的运行时间从几秒钟增加到几分钟?

  19. 19

    为什么在查询中添加WHERE语句(在带有索引的列上)会使我的运行时间从几秒钟增加到几分钟?

  20. 20

    如果在此期间发出请求,服务器仅在几分钟后关闭

  21. 21

    Xcode 5.0挂起链接-几分钟后失败

  22. 22

    几分钟后,Google Analytics(分析)将失去跟踪

  23. 23

    几分钟后清除工作流程

  24. 24

    几分钟后清除工作流程

  25. 25

    几分钟后,蓝牙保持“挂起”状态

  26. 26

    播放mp3几分钟后,MediaPlayer静音

  27. 27

    几分钟后,Internet停止工作

  28. 28

    几分钟后声音停止工作了吗?

  29. 29

    openVPN 在几分钟不活动后停止

热门标签

归档