2011-12-19 89 views
1

這個想法是在主進程中創建服務器,並處理worker中的請求。我想利用所有的CPU核心,並有一個負載平衡。NodeJS | Socket.IO如何向服務器發送服務器處理程序?

起初,我試圖從主發送服務器處理器來工人:

var cluster = require('cluster'); 

if (cluster.isMaster) { 
    var app = require('express').createServer(); 
    app.listen(1234); 

    var worker = cluster.fork(); 
    worker.stdin.write('fd', 'utf8', app._handle); 
} else { 
    process.stdin.resume(); 
    process.stdin.on('fd', function(fd){ 
     var stream = require('net').Stream(fd); 
     var io = require('socket.io').listen(stream); 
     io.sockets.on('connection', function(socket){ 
      ... 
     } 
    } 
} 

但寫上(「的fd」 ......)的事件處理程序在員工不被解僱。然後,我把一切都掌握在以檢查,如果這是不可能的:

var app = require('express').createServer(); 
    app.listen(1234); 
    var stream = require('net').Stream(app._handler); 
    var io = require('socket.io').listen(stream); 

服務器啓動沒有任何錯誤,但不起作用。我不能事件請求從標籤客戶端的腳本socket.io.js:

<script src="http://localhost:8080/socket.io/socket.io.js"></script> 
Response: Cannot GET /socket.io/socket.io.js 

所以我有兩個煩惱:

  1. 如何打開socket描述符發送給工人?
  2. 如何通過此描述符爲服務器設置處理程序?

回答

0

你並不需要照顧文件描述符等你自己,看一個類似的問題,我剛纔已經回答這裏:

Node.js, multi-threading and Socket.io

代碼示例:

var cluster = require('cluster'); 
var http = require('http'); 
var numCPUs = require('os').cpus().length; 

if (cluster.isMaster) { 
    // Fork workers. 
    for (var i = 0; i < numCPUs; i++) { 
    cluster.fork(); 
    } 
} else { 
    var sio = require('socket.io') 
    , RedisStore = sio.RedisStore 
    , io = sio.listen(8080, options); 

    // Somehow pass this information to the workers 
    io.set('store', new RedisStore); 

    // Do the work here 
    io.sockets.on('connection', function (socket) { 
    socket.on('chat', function (data) { 
     socket.broadcast.emit('chat', data); 
    }) 
    }); 
} 
+0

它看起來像腳本將在工人中創建一些套接字並將它們綁定到一個端口。我希望這裏有個例外。你能解釋一下這裏發生了什麼嗎? – htonus 2011-12-20 07:25:24

+0

查看羣集的文檔,以更好地理解:http://nodejs.org/docs/v0.6.6/api/cluster.html它有一些例子,類似於我上面的。 – alessioalex 2011-12-20 07:32:25

相關問題