2013-12-18 50 views
0

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

主持人的技术支持告诉我,我的应用程序总是使用大量内存。这对我来说似乎不太可能。据我所知,每个域分配了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

在这里猜测:如果您的socket.io传输是XHR,并且您的提供程序在超时时关闭http连接,那么该超时可能是120秒,这可能是原因。 –

+0

XHR超时不会触发'连接'事件(它会自动重新连接)。所以这个问题更像是节点进程崩溃每2分钟一次。 – damphat

回答

0

你可以得到大量的诊断信息有关使用部署iisnode使Node.js应用iisnode-debug HTTP响应头。以下是详细信息: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,这将帮助您确定是否有任何进程确实被回收。

+0

谢谢!我添加了它,并且几次检查了调试信息。 node.exe进程永远不会超过50MB,并且w3wp.exe永远不会超过100MB。我甚至在节点服务器代码中调用了process.memoryUsage(),并通过套接字将它发送到聊天应用程序并在那里获取相同的数据。我已经通知我的主机我的发现是什么,但他们仍然坚持认为我的代码是问题,并且该进程正在被回收,因为他们的IIS日志完全是这样说的。我不知道现在该怎么做,但感谢您的帮助! – Krummelz

相关问题