2017-05-09 33 views
1

我正在嘗試在可與遠程socket.io服務器進行通信的Raspberry Pi上構建node.js應用程序。爲什麼我的socket.io應用程序在Raspberry Pi上運行時立即斷開連接?

當建立新連接並關閉現有連接時,socket.io服務器很簡單地寫入控制檯。

在瀏覽器中運行時,socket.io客戶端按預期工作。

但是,當我從Raspberry Pi運行客戶端代碼時,它會連接並立即終止。這不允許我執行任何功能,例如發射或接收。

on connect事件永遠不會被觸發。

var io = require('/usr/local/lib/node_modules/socket.io-client'); 
var serverUrl = 'http://remoteserver.com'; 

console.log('Connecting to ' + serverUrl); 
var socket = io.connect(serverUrl); 

socket.on('connect', function(socket) { 
    console.log('Connection established!'); 
    console.log(socket.id); 

    socket.on('disconnect', function() { 
      console.log('Disconnected from server'); 
    }); 

}); 

上面會輸出代碼:

Connecting to: http://remoteserver.com 

在服務器端,輸出端會顯示一個新的連接,並最終報收超時。

爲什麼客戶端連接事件不會觸發?我如何堅持這種連接,以便我最終可以將輸入發送到服務器?從您的代碼

socket.close(); 

+1

因爲您正在立即關閉連接。 –

+0

你應該添加一些錯誤處理:https://github.com/socketio/socket.io-client/blob/master/docs/API.md#event-connect_error服務器是否實現某種認證(基於會話cookie或者其他的東西)? – robertklep

+0

確保您沒有在代理或積極的應用程序防火牆後面建立連接,因爲這可能會導致您描述的問題。初始連接將成功,但其餘的套接字流量永遠無法恢復,並且您的客戶端最終會超時並關閉。 – Chris

回答

2

刪除線。您正在關閉套接字。請記住,所有事件處理程序都是異步的。它們是非阻塞的,將來會被調用一段時間。同時,其餘的代碼運行完成,因此您的客戶端有機會獲取任何事件(除斷開連接事件之外)之前,您的代碼將被執行。

如果你想做一些事情,然後關閉套接字,那麼你只需要關閉一些事件處理程序的套接字,它表明你的操作已經完成,你現在已經完成了套接字。

+0

對不起,我感到困惑。如果沒有socket.close()行,則會出現相同的結果。連接只是掛起而沒有事件被調用。我嘗試過其他事件名稱,但這些名稱也未被調用。 – aaronfarr

+0

@aaronfarr - 你需要做一些調試。你顯示的客戶端代碼沒有什麼明顯的錯誤。我建議你爲事件'connect_error','connect_timeout'和'error'安裝事件處理程序,並查看是否有觸發事件。另外,'socket.on('connect',function(socket){'應該是'socket.on('connect',function(){'''''''''''''''''''對於客戶端代碼,您已經擁有了'socket'。 – jfriend00

0

當你想關閉樹莓派的連接時,你只需要調用socket.close()。此外,socket.io-client文檔不使用.connect方法,而是調用require('socket.io-client')(serverUrl)

var io = require('/usr/local/lib/node_modules/socket.io-client'); 
var serverUrl = 'http://remoteserver.com'; 

console.log('Connecting to ' + serverUrl); 
var socket = io(serverUrl); 

socket.on('connect', function(socket) { 
    console.log('Connection established!'); 
    console.log(socket.id); 
}); 

socket.on('disconnect', function() { 
    console.log('Disconnected from server'); 
}); 

//Removed the socket.close() line 
+0

對不起,如果沒有socket.close()行,會出現相同的結果。你的例子會說「連接到http://remoteserver.com」並掛起。它永遠不會到達「連接」事件內部。我添加了socket.close()行來查看是否至少可以觸發服務器端的斷開連接事件(事實並非如此)。所以其他事情一定要在這裏發生。 – aaronfarr

+0

已被更新回答。 –

相關問題