socket.io +安卓 - 断开插座,然后重新连接不同的URL
问题描述:
我有什么: 我有socket.io实现Android应用程序。服务器在node.js上运行。服务器IP在应用中被硬编码。客户端与服务器成功通信 - 他们发送和接收消息。我用我的客户socket.io +安卓 - 断开插座,然后重新连接不同的URL
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本机)
任何帮助或建议将非常感激,所以在此先感谢!
答
在断开连接真正完成之前,您应关闭套接字并关闭通道。
这应该是你的情况:
//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中有什么不同是我设置了选项reconnect = true;让我的客户在线时重新连接。还没有尝试更新到最新版本 - 我会尽快做到 – d324223
我已经更新到1.0.0版本,也试过选项reconection = false;但仍然没有运气..客户端连接到新的服务器,但仍然不听从新服务器的消息 – d324223
您是否使用了静态方法'socket = IO.socket(“http:// new_url”);'?在尝试连接到一个新套接字之前,您可能需要调用'socket.disconnect()'然后调用socket.off(“channel”,EventEmitterAnonymousClass);''。 – MatPag