IISNode,Express & Socket.IO Chat 应用程序每 ~2 分钟重新连接一次



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

来自主机的技术支持告诉我,我的应用程序总是使用大量内存。这对我来说似乎不太可能。据我所知,每个域都分配了512MB的内存。他们告诉我,当内存用完时,应用程序池会被回收,这就是我的应用程序不断重新连接的原因。我已经无休止地测试了这段代码。即使在我的开发计算机上运行它,我的节点.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();
    }
});
您可以使用

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 工作进程和节点.exe的 PID,这将帮助您确定是否确实回收了任何进程。

最新更新