奇怪的問題我還沒有真正發現文檔。我認爲它可能最終只是一個「你不明白產品如何工作」的簡單例子,我希望有人能填補這個空白。Socket.io多個連接
以下是發生了什麼...我有3個獨立的應用程序是socket.io服務器。他們都在不同的端口上聆聽。每臺服務器都用於不同的專用目的。我正在構建應用程序,以便我可以部分擴展它,並隻影響我需要更改/更新的單個獨立部分。
這是工作正常,直到我意識到,每個運行的應用程序有一個額外的套接字連接每臺服務器。所以如果我有3個應用程序,那麼我在每臺服務器上都有3個連接。
證據是,如果我向每臺服務器添加一個console.log(「連接」),然後連接一個客戶端,每個服務器會報告與服務器一樣多的連接。希望這是有道理的。
我的目標是每臺服務器需要1個連接。好像這些連接都是作爲所有套接字服務器的通用連接。我的服務器監聽器設置是這樣的:
io = require('socket.io').listen(26265) // can use up to 26485
我的客戶端連接是這樣的:
socket = new io('http://localhost:26265')
編輯:
要添加到我原來的問題,這樣就可以看到更多的代碼。 ..
完整的客戶端代碼:
importJS('/js/pages/admin_base.js',function(){
AdminIO = new io('http://localhost:26266');
AdminIO.on('send_users',function(rows){
toggleLoad();
/*
if(typeof rows === 'object'){
rows = Array(rows);
}
*/
appendUsers(rows);
console.log(rows);
});
AdminIO.on('failed_users',function(){
toggleLoad();
dropInfo("Failed to retrieve userlist",{level: "error"});
});
AdminIO.on('test',function (q) {
console.log(q);
});
queryUsers(AdminIO);
});
服務器代碼是很長的。所以相關的作品是:
var io = require('socket.io').listen(26266); // can use up to 26484
//.... imported additional modules and defined simple functions here
io.on('connection', function (socket) {
socket.on('restart_request', function(req){
var success = false
, session = JSON.parse(req.session)
, sessionID = session.sessionID;
checkSession(sessionID, function (ses) {
if (ses === false) { console.error('CheckSession failed: No session exists'); return; }
if (ses.user.uuid !== session.uuid) { console.error('CheckSession failed: UUID mismatched'); return; }
if (ses.user.role < conf['Permissions']['lm_restart']){ socket.emit('restart_fail','Insufficient permissions.'); return; }
if(process.platform === 'win32'){
executeCMD('START "" .\\windows\\scripts\\restart_lm.bat',function(err,res){
var errSent = false;
if(err){
console.error(err);
if(!errSent){ socket.emit('restart_fail','Restart failed'); }
errSent = true;
if(res === null){return;}
}
console.log(res);
socket.emit('restart_success','LM successfully restarted.');
});
}
else if(process.platform === 'linux'){
}
});
});
socket.on('get_users',function(req){
var success = false
, session = JSON.parse(req.session)
, opts = req.opts || null
, sessionID = session.sessionID
, col = opts.col || null
, where = opts.where || null
, range = opts.range || null
;
checkSession(sessionID, function (ses) {
if (!ses) { console.error('CheckSession failed: No session exists'); return; }
if (ses.user.uuid !== session.uuid) { console.error('CheckSession failed: UUID mismatched'); return; }
if (ses.user.role < conf['Permissions']['lm_user_query']){ socket.emit('userQuery_fail','Insufficient permissions.'); return; }
Query.users({col: col, where: where, range: range},function(err,res){
if(!err){socket.emit('send_users',res);}
else {socket.emit('failed_users',true);}
});
});
});
socket.on('test',function(q){
socket.emit('test',q);
});
});
多連接有什麼問題? – SLaks
如果只是多個連接,它不會是一個問題。問題在於,對於多個連接,所有的.emit()命令都會多次運行。這意味着很多浪費時間/網絡資源 – Ethan
聽起來就像你在向錯誤的東西或錯誤的地方發射。 – SLaks