2017-11-10 164 views
0

我有什麼: 我有socket.io實現Android應用程序。服務器在node.js上運行。服務器IP在應用中被硬編碼。客戶端與服務器成功通信 - 他們發送和接收消息。我用我的客戶socket.io +安卓 - 斷開插座,然後重新連接不同的URL

IO.socket版本:('io.socket:socket.io-client:1.0.0')

我需要得到:我的問題是我必須改變其客戶端連接到服務器的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)客戶端連接到第二個服務器,但客戶端仍連接到第一臺服務器(客戶端仍在監聽來自第一臺服務器的命令)。實際上,我認爲客戶創建了第二個套接字,但沒有正確關閉第一個套接字。

在這種情況下,客戶端仍然從第一臺服務器接收消息,但它將響應發送到新的第二臺服務器。很奇怪,但這是我設法在這裏得到的最遠的地方。

我試圖斷開連接的客戶端,並開始新的偵聽器調用客戶端:

  • 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