我有一個服務器套接字和一個使用 TCP 長連接模式的 GPS 設備。
他們可以一起連接和交換資料。node.js 服務器是這樣的:
net.createServer(function (socket) {
console.log('GPS ip:port' socket.remoteAddress ':' socket.remotePort);
socket.on('data', console.log);
}).listen(‘0.0.0.0’, 8888);
該設備連接正確,我能夠從中接收資料。我可以通過使用相同的程序向它發送命令,只需做socket.write('dothisplease'),這也有效。
現在我有另一個作業行程,它應該定期發送命令。當設備連接時,我可以從 console.log 獲取 ip 和埠,它看起來像: xx.xxx.xx.xxx:63024
我嘗試使用這個組合 ip:port 來創建新連接:
var client = new net.Socket();
client.connect(gps_port, gps_ip, function () {
client.write('dothisplease');
});
...但結果是ECONNREFUSED
- 使用同一埠創建與設備的第二個連接是否正確?
- 為什么它在同一個程序中起作用,但在另一個程序中不起作用?
- 最終,我可以將套接字傳遞給另一個節點 Worker 行程嗎?如何?
非常感謝!
uj5u.com熱心網友回復:
您的服務器正在偵聽埠 8888。這是所有客戶端都需要連接的埠。客戶端還必須知道服務器的 IP 地址是什么才能連接到它。客戶端使用目標 IP 地址和目標埠來指定 TCP 連接的目標。
socket.remotePort不是任何人都可以連接的埠。這是第一個客戶端用來連接到您的服務器埠的傳出埠。傳出埠是客戶端記賬的東西,它幫助客戶端跟蹤哪個網路流量屬于哪個套接字,通常由客戶端隨機分配。
您閱讀了更多關于remotePort這里的內容。
作為參考,一個 TCP 連接由兩個端點組成,每個端點都有一個 IP 地址和一個埠。服務器需要有一個已知的 IP 地址和一個已知的埠,所有客戶端都將使用它來連接它。客戶端已經擁有自己的 IP 地址。然后,在與服務器建立 TCP 連接的程序中,客戶端將動態分配一個未使用的埠號,用于該套接字的通信。客戶端使用該埠號來跟蹤哪個網路流量屬于哪個套接字。這不是任何人都可以連接的埠號。
使用同一埠創建與設備的第二個連接是否正確?
不可以。您不能創建與客戶端的連接。您只能創建與偵聽服務器的連接。而且,您也不能使用屬于該其他套接字的客戶端埠。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/516544.html
下一篇:表達錯誤的靜態路徑反應懶惰
