【问题标题】:socket.io + android - disconnect socket and reconnect with different urlsocket.io + android - 断开套接字并使用不同的 url 重新连接
【发布时间】:2018-04-24 05:51:42
【问题描述】:

我有什么: 我有带有 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();

所以我的一般问题是:

  1. 为什么我的客户端没有开始监听新的服务器消息,即使这个客户端正在向这个新服务器发送响应?
  2. 也许有一种方法可以在不关闭套接字侦听器的情况下切换/更新它?
  3. 关闭/断开/销毁第一个套接字的正确方法是什么?
  4. 也许有人能给我一个更好的方法来改变客户端正在监听的io.socket服务器IP? (请注意,此应用是 Android 原生的)

任何帮助或建议将不胜感激,因此提前致谢!

【问题讨论】:

    标签: android sockets socket.io


    【解决方案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();
    

    【讨论】:

    • 是的,我试过 forceNew = true;选项,但客户端仍保持连接到第一台服务器。我的 conf 中的不同之处在于我设置了 option reconnect = true;让我的客户在他们在线时重新连接。还没有尝试更新到最新版本 - 我会尽快更新
    • 我已经更新到 1.0.0 版本,也尝试了选项 reconection=false;但仍然没有运气.. 客户端连接到新服务器但仍然不收听来自新服务器的消息
    • 你用过静态方法socket = IO.socket("http://new_url");吗?在尝试连接到新套接字之前,您可能需要先调用socket.disconnect(),然后再调用socket.off("channel", EventEmitterAnonymousClass);
    • 我已经更新了我的答案,让我们试试看,告诉我进展如何
    • 太棒了,它现在可以正常工作了!! :) (我认为线索是触发听者,然后再次连接)非常感谢您的大力帮助!
    猜你喜欢
    • 1970-01-01
    • 2019-03-05
    • 2012-05-28
    • 1970-01-01
    • 2021-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多