IISNode,Express& Socket.IO聊天应用程序每隔约2分钟重新连接一次

时间:2013-12-18 14:03:18

标签: node.js express socket.io iisnode

我已经使用Express和Socket.IO创建了一个简单的聊天应用程序,我现在已经在使用IISNode的托管服务提供商上设置了该应用程序。我遇到的问题是套接字连接大约每两分钟重新连接一次。无论套接字上是否有活动,都会发生这种情况。

主持人的技术支持告诉我,我的应用程序总是占用大量内存。这对我来说似乎不太可能。据我所知,每个域分配512MB内存。他们告诉我,当内存用完时,应用程序池会被回收,这就是我的应用程序不断重新连接的原因。我无休止地测试了这段代码。即使在我的开发机器上运行它,我的node.exe进程也不会使用超过32MB的内存。

所以我需要进行健全检查;下面是我的代码。我真的在这里做些蠢事吗?有没有办法让我分析应用程序以找出它实际使用了多少内存?

服务器端:

var express = require('express');
var http = require('http');

var app = express();
var server = http.createServer(app);

var io = require('socket.io').listen(server);

app.use(express.static(__dirname + '/public'));

io.configure(function() {
    io.set('resource', '/public/socket.io');
});

io.sockets.on('connection', function (socket) {
    socket.on('fromClient', function (data) {
    io.sockets.emit('fromServer', { who: data.who, message: data.message });
    });
});

server.listen(process.env.PORT || 8080);

客户端:

window.addEventListener("load", function () {

    var msgContainer = document.getElementById("msgContainer");
    var btnSend = document.getElementById("sendMessage");

    //this is my localhost, of course, substituted by my domain name on live
    var socket = io.connect('http://localhost:8080/', {
        resource: 'public/socket.io'
    });

    var theWho = document.getElementById("theWho");
    var newMessage = document.getElementById("newMessage");

    if (newMessage.addEventListener) {
        newMessage.addEventListener('keyup', newMessage_keyUp, false);
    } else if (btnSend.attachEvent) {
        newMessage.attachEvent('onkeyup', newMessage_keyUp);
    }

    function newMessage_keyUp(e) {
        if (e.keyCode == 13) {
            messageToServer();
        }
    }

    function messageToServer() {
        var who = theWho.value;
        var message = newMessage.value;
        if (who == "") {
            who = "Anon";
        }
        socket.emit("fromClient", {
            who: who,
            message: message
        });
        newMessage.value = "";
        newMessage.focus();
    }

    if (btnSend.addEventListener) {
        btnSend.addEventListener('click', messageToServer, false);
    } else if (btnSend.attachEvent) {
        btnSend.attachEvent('onclick', messageToServer);
    }

    socket.on('fromServer', function (data) {
        addMessage(data.who, data.message);
    });

    //THIS is what keeps firing ever ~2 minutes
    socket.on('connect', function () {
        socket.emit("fromClient", {
            who: "Server",
            message: "New user connected.."
        })
    })

    function addMessage(who, message) {
        var m = document.createElement("div");
        m.innerHTML = "<strong>" + who + ":</strong>&nbsp;" + message;
        m.setAttribute("class", "msg");
        msgContainer.appendChild(m);
        m.scrollIntoView();
    }
});

1 个答案:

答案 0 :(得分:0)

您可以使用iisnode-debug HTTP响应标头获取有关使用iisnode部署的Node.js应用程序的大量诊断信息。以下是详细信息:http://tomasz.janczuk.org/2012/11/diagnose-nodejs-apps-hosted-in-iis-with.html

特别是,使用iisnode-debug标头将使您能够检查IIS工作进程(iisnode本身运行的位置)以及node.exe进程(运行Node.js应用程序的位置)的内存消耗。它还会报告IIS工作进程和node.exe的PID,这将帮助您确定是否确实回收了任何进程。