2017-05-09 1 views
1

リモートsocket.ioサーバーと通信できるRaspberry Piでnode.jsアプリケーションを構築しようとしています。なぜ私のsocket.ioアプリはRaspberry piで動くとすぐに切断されますか?

socket.ioサーバーは、新しい接続が確立されたときと既存の接続が閉じられたときにコンソールに簡単に書き込みます。

socket.ioクライアントは、ブラウザで実行したときに正常に動作します。

しかし、私はRaspberry Piからクライアントコードを実行すると接続し、すぐに終了します。これにより、放出や受信などの機能は実行できません。

オン接続イベントは発生しません。

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

は、行を削除します。すぐにソケットを閉じています。すべてのイベントハンドラは非同期であることに注意してください。彼らはノンブロッキングで、将来はいつか呼ばれます。一方、コードの残りの部分は完了するまで実行されます。したがって、クライアントが(切断イベント以外の)イベントを取得する前にsocket.close()が実行されます。

いくつかの処理をしてからソケットを閉じるには、操作が完了したことを示すイベントハンドラからソケットを閉じる必要があります。

+0

混乱して申し訳ありません。 socket.close()行がなければ、同じ結果が得られます。接続は単にハングアップし、イベントは呼び出されません。私は他のイベント名を試しましたが、それらは呼び出されません。 – aaronfarr

+0

@aaronfarr - あなたはいくつかのデバッグをする必要があります。あなたが表示するクライアント側のコードには明らかに間違ったことはありません。私はイベント 'connect_error'、' connect_timeout'と 'error'のイベントハンドラをインストールし、それらのイベントがトリガされているかどうかを確認することをお勧めします。また、 'socket.on( 'connect'、function(socket){'は 'socket.on( 'connect'、function(){'は 'socket'パラメータなしでなければなりません。 'socket'。 – jfriend00

0

ラズベリーパイからの接続を閉じるには、socket.close()を呼び出すだけで済みます。また、socket.io-クライアントのマニュアルは.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"と言うだけでハングアップします。それは "connect"イベントの中に到達することはありません。私はsocket.close()行を追加して、少なくともサーバ側で切断イベントを引き起こすことができるかどうかを確認しました。そこで何か他のものがここで起こっているに違いない。 – aaronfarr

+0

答えが更新されました。 –

関連する問題