socket.io + android - 断开套接字并重新连接不同的网址

时间:2017-11-10 22:46:55

标签: android sockets socket.io

我拥有的内容: 我有一个带有 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原生的)
  5. 非常感谢任何帮助或建议,所以提前感谢!

1 个答案:

答案 0 :(得分:2)

在断开连接之前,您应关闭套接字并关闭通道。

这应该是你的情况:

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