Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/191.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
socket.io+;android-断开套接字并重新连接到不同的url_Android_Sockets_Socket.io - Fatal编程技术网

socket.io+;android-断开套接字并重新连接到不同的url

socket.io+;android-断开套接字并重新连接到不同的url,android,sockets,socket.io,Android,Sockets,Socket.io,我所拥有的: 我有一个Android应用程序,带有socket.io实现。服务器在node.js上运行。应用程序中对服务器IP进行了硬编码。客户端与服务器成功通信-它们发送和接收消息 我在客户端中使用的IO.socket版本:('IO.socket:socket.IO客户端:1.0.0') 我需要得到什么:我的问题是,在客户端收到确定的消息后,我必须更改客户端连接到的服务器IP 简化的客户端套接字行为更不像这样: socket.on("msg", new Emitter.Listener()

我所拥有的: 我有一个Android应用程序,带有socket.io实现。服务器在node.js上运行。应用程序中对服务器IP进行了硬编码。客户端与服务器成功通信-它们发送和接收消息

我在客户端中使用的IO.socket版本:
('IO.socket:socket.IO客户端: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();
所以我的问题通常是:

  • 为什么我的客户端即使正在向新服务器发送响应,也没有开始侦听新服务器消息
  • 也许有一种方法可以在不关闭套接字侦听器的情况下切换/更新它
  • 关闭/断开/破坏第一个插座的正确方法是什么
  • 也许有人能给我一个更好的方法来改变客户端正在监听的io.socket服务器IP的提示?(请注意,此应用程序是Android本机)

  • 任何帮助或建议都将不胜感激,请提前感谢

    在断开连接真正完成之前,您应该关闭套接字并关闭通道

    这应该是你的情况:

    //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();
    

    在断开连接真正完成之前,您应该关闭套接字并关闭通道

    这应该是你的情况:

    //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();
    

    是的,我试过forceNew=true;选项,但客户端仍保持与第一台服务器的连接。在我的配置中不同的是,我设置了option reconnect=true;让我的客户在线时重新连接。没有尝试更新到最新版本-我会尽快更新到1.0.0版本,也尝试了选项Reconction=false;但是还是没有运气。。客户端连接到新服务器,但仍然不侦听来自新服务器的消息您是否使用了静态方法
    socket=IO.socket(“http://new_url");?您可能需要调用
    socket.disconnect()
    ,然后调用
    socket.off(“通道”,EventEmitterAnonymousClass)在尝试连接到新套接字之前。我已经更新了答案,让我们试试,让我知道它是如何运行的。现在,它工作正常!!:)(我想这条线索让听众兴奋起来,然后又接通了)非常感谢你的帮助!是的,我试过forceNew=true;选项,但客户端仍保持与第一台服务器的连接。在我的配置中不同的是,我设置了option reconnect=true;让我的客户在线时重新连接。没有尝试更新到最新版本-我会尽快更新到1.0.0版本,也尝试了选项Reconction=false;但是还是没有运气。。客户端连接到新服务器,但仍然不侦听来自新服务器的消息您是否使用了静态方法
    socket=IO.socket(“http://new_url");?您可能需要调用
    socket.disconnect()
    ,然后调用
    socket.off(“通道”,EventEmitterAnonymousClass)在尝试连接到新套接字之前。我已经更新了答案,让我们试试,让我知道它是如何运行的。现在,它工作正常!!:)(我想这条线索让听众兴奋起来,然后又接通了)非常感谢你的帮助!