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

我在客户端中使用的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();
    

    ,所以我的问题通常是:
  • 即使此客户端向该新服务器发送响应,为什么我的客户端仍未开始收听新服务器消息?
  • 也许有一种方法可以在不关闭套接字监听器的情况下进行切换/更新?
  • 关闭/断开/销毁第一个套接字的正确方法是什么?
  • 也许有人可以给我提示更好的方法来更改客户端正在监听的io.socket服务器IP? (请注意,该应用程序是Android原生的)

  • 任何帮助或建议将不胜感激,所以在此先感谢!

    最佳答案

    在断开真正完成之前,您应该关闭套接字并关闭 channel 。

    这应该是您的情况:

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

    关于android - socket.io + android-断开套接字并使用不同的URL重新连接,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47232293/

    10-11 22:31
    查看更多