2017-11-10 161 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