我所拥有的:
我有 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();
,所以我的问题通常是:
任何帮助或建议将不胜感激,所以在此先感谢!
最佳答案
在断开真正完成之前,您应该关闭套接字并关闭 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/