2017-04-10 53 views
1

我使用nodejs集羣與socket.io,並在主線程中使用內置的網絡庫來監聽端口並手動傳遞連接(套接字) (基於客戶端的IP地址,所以如果客戶端重新連接到服務器,客戶端將加入到同一個工作者)。這很好,但我想測試,並且我想從本地主機加入不同的工作人員。節點js網絡庫 - 獲取有關客戶端(套接字)的信息

有沒有什麼方法可以獲得有關客戶端的信息(例如瀏覽器名稱,自定義參數)或其他任何使本地主機上的兩個或多個客戶端不同的信息? - 如果我能夠在開發環境中將客戶端加入基於瀏覽器的工作人員(Chrome客戶端轉到工作人員1,Firefox客戶端轉到工作人員2),這可能很酷。

private createServer(): void { 
    var self = this; 

    this.masterServer = net.createServer(<any>{ pauseOnConnect: true }, (connection) => { 
     console.log('server', connection); 

     let worker = self.workers[self.getWorkerIndex(connection.remoteAddress, self.workerCount)]; 
     worker.send('privateCon', connection); 

    }).listen(self.serverPort); 
} 
+0

這是有點困難的連接必須發生在任何額外的協議信息可用之前。你希望這個工作的操作系統是什麼? – Matt

+0

源IP,源TCP端口和目標IP是你擁有的3件東西 – Matt

+0

dev env是windows 10.源ip,tcp端口和dedtination ip在來自localhost的任何連接上都是相同的。 – Twois

回答

1

在Windows和Linux整個127.0.0.0/8範圍內工作的loobback界面在默認情況下,所以你可以只要你的服務器沒有偵聽一個特定的地址區分由它們的目的地或localAddress連接。

運行一個簡單的服務器

$ node -e 'net.createServer(connection => { 
    console.log(connection.remoteAddress, connection.remotePort, connection.localAddress) 
}).listen(8082)' 

然後用像telnetnc甚至node連接。

$ node -e 'client = net.connect(8082, "127.0.0.4",()=> client.end())' 

OSX總是得到指定的IPv4,不知道即使你將獲得在Windows上也映射到IPv6的連接,但服務器的輸出應改爲類似:

::ffff:127.0.0.4 57290 ::ffff:127.0.0.4 

所以你可以使用你的連接處理器的東西,如

switch (connection.localAddress){ 
    case '::ffff:127.0.0.1': return worker1 
    case '::ffff:127.0.0.2': return worker2 
    case '::ffff:127.0.0.3': return worker3 
    case '::ffff:127.0.0.4': return worker4 
    default: return lookupWorker() 
} 
+0

只要注意,如果任何人在webpack 2上試用這個地址,你必須設置主機到0.0.0.0,因爲默認值是127.0.0.1。所以你可以加上這個:--host 0.0.0.0 – Twois

+0

我猜如果你在127.0.0.1上監聽,你可以區分源地址,但是在客戶端指定一個源地址的支持較少。我不確定瀏覽器是否支持chrome或firefox。 – Matt

相關問題