2017-11-10 14 views
0

私が持っているもの: 私は socket.io実装してAndroidアプリケーションを持っています。サーバーはnode.jsで動作します。サーバーIPは、アプリケーションにハードコードされています。クライアントはサーバーと正常に通信します。メッセージは送受信されます。 ('io.socket:socket.io-client:1.0.0')socket.io +アンドロイド - 切断ソケットと再接続し、別のURLで

私が取得する必要が何を:私は私のクライアントで使用しています

IO.socketバージョン私の問題は、クライアントが決定受け取った後、私は、クライアントが接続しているサーバーのIPを変更する必要がありますメッセージ。


簡素化されたクライアントソケットの動作は、このような、より少ない:

socket.on("msg", new Emitter.Listener() { 
       @Override 
       public void call(Object... args) { 
        try { 
         switch (msg){ 
          case "1": 
           keepOnListeningFirstServer(); 
           break; 
          case "2": 
           connectToAnotherServer(); 
           break; 
        ... 

私は達成するために管理どのような特定のサーバのコマンドの後に(msg = 2)クライアントが第二のサーバに接続しますが、クライアントがに接続されたままということです最初のサーバー(クライアントはまだ最初のサーバーからコマンドを聞いています)。実際には、クライアントが2番目のソケットを作成しますが、1番目のソケットを正しく閉じることはできません。

この場合、クライアントは最初のサーバーからメッセージを受信しますが、新しい2番目のサーバーに応答を送信します。かなり変わったけど、それは私がここでこれで得ることができた最も遠いものだった。

  • socket.disconnect();
  • socket.close();
  • socket.off();

をしてから、新しいソケットを作成し、それを接続する:私はクライアントの接続を切断し、クライアントに呼びかけた新しいリスナーを起動しようとしている何

socket = IOSocket.getInstance(socketIP).getSocket(); 
socket.connect(); 

だから、一般的に、私の質問は以下のとおりです。

  1. 私のクライアントは、このクライアントは、この新しいサーバに応答を送信しているにもかかわらず、新しいサーバーのメッセージを聞いて開始されていないのはなぜ?
  2. おそらく、ソケットリスナーを閉じずにそれを切り替える/更新する方法がありますか?
  3. この最初のソケットを閉じる/切り離す/破壊する適切な方法は何ですか?
  4. 誰かが、クライアントが聞いているio.socketサーバーIPを変更するためのより良い方法を教えてくれるかもしれませんか? (このアプリケーションはAndroidネイティブであることにご注意ください)

ご協力いただきありがとうございます。

答えて

1

実際に切断が完了する前に、ソケットを閉じてチャネルをシャットダウンする必要があります。

これはあなたのケースのようになります。

//create the initial socket 
Socket socket = IO.socket("your_url"); 

//define a constant for your channel 
public static final String ON_MESSAGE_RECEIVED = "msg"; 

//define the event listener 
private Emitter.Listener onMessageReceived = new Emitter.Listener() { 
     @Override 
     public void call(Object... args) { 
      //your logic for the event here 
     } 
}); 

//attach your channels to the socket 
socket.on(ON_MESSAGE_RECEIVED, onMessageReceived); 
socket.connect(); 

//when you want to disconnect the socket remember to shutdown all your channels 
socket.disconnect(); 
socket.off(ON_MESSAGE_RECEIVED, onMessageReceived); 

//Then create a new socket with a new url and register again for the same event 
IO.Options opts = new IO.Options(); 
opts.forceNew = true; 
opts.reconnection = false; 
socket = IO.socket("new_url", opts); 
socket.on(ON_MESSAGE_RECEIVED, onMessageReceived); 
socket.connect(); 
+0

はい、私が試したforceNew =はtrue。クライアントはまだ最初のサーバーに接続したままです。私のconfの違いは、オプションreconnect = trueを設定していることです。私のクライアントがオンライン中に再接続するようにします。最新バージョンに更新しようとしなかった - すぐにやるよ – d324223

+0

バージョン1.0.0にアップデートしました。また、オプションreconection = falseで試しました。クライアントは新しいサーバに接続しますが、まだ新しいサーバからのメッセージを聞きません – d324223

+0

静的メソッド 'socket = IO.socket(" http:// new_url ");'を使用しましたか?そして、新しいソケットに接続する前に 'socket.disconnect()'と 'socket.off(" channel "、EventEmitterAnonymousClass);を呼び出す必要があるでしょう。 – MatPag

関連する問題