2017-11-10 1 views
0

내가 무엇을 가지고 : 내가 socket.io 구현 안드로이드 응용 프로그램이 있습니다. 서버는 node.js에서 실행됩니다. 서버 IP는 앱에 하드 코딩되어 있습니다. 클라이언트는 서버와 성공적으로 통신하며 메시지를 보내고받습니다. 내 클라이언트에서 사용하고socket.io + 안드로이드 - 차단 소켓과 다시 연결 다른 URL을

IO.socket 버전 : 클라이언트가 결정받은 후, 내 문제는 내가 클라이언트가 연결된 서버의 IP를 변경해야 할 것입니다 : 내가 할 필요가있는 무엇 ('io.socket:socket.io-client:1.0.0')

메시지.


단순화 된 클라이언트 소켓의 동작은 더 적은 다음과 같습니다이다 : 특정 서버 명령 (msg = 2) 클라이언트가 두 번째 서버에 연결하지만, 이후에 클라이언트에 연결된 상태로 유지

socket.on("msg", new Emitter.Listener() { 
       @Override 
       public void call(Object... args) { 
        try { 
         switch (msg){ 
          case "1": 
           keepOnListeningFirstServer(); 
           break; 
          case "2": 
           connectToAnotherServer(); 
           break; 
        ... 

내가 달성하기 위해 관리하는 것을 첫 번째 서버 (클라이언트는 여전히 첫 번째 서버의 명령을 듣고 있습니다). 실제로 나는 클라이언트가 두 번째 소켓을 생성하지만 첫 번째 소켓을 제대로 닫지 않는다고 생각합니다.

이 경우 클라이언트는 첫 번째 서버로부터 메시지를 수신하지만 새 두 번째 서버로 응답을 보냅니다. 꽤 별난, 그러나 그것은 내가 여기에서 이럭저럭 얻을 수 있었던 가장 먼 것이었다.

  • socket.disconnect();
  • socket.close();
  • socket.off();

을하고 새로운 소켓을 생성하고 연결하기 : 나는 클라이언트를 분리하고 클라이언트에서 호출 된 새로운 리스너를 시작하는 시도 무엇

:

socket = IOSocket.getInstance(socketIP).getSocket(); 
socket.connect(); 

그래서 일반적으로 내 질문은 :

  1. 왜 클라이언트가이 새 서버에 대한 응답을 보내는 경우에도 새 서버 메시지에 대한 내 고객 시작 청취가 아니다?
  2. 어쩌면 소켓 수신기를 닫지 않고 스위치/업데이트 할 수있는 방법이 있습니까?
  3. 이 첫 번째 소켓을 닫거나 연결 해제/파괴하는 적절한 방법은 무엇입니까?
  4. 어쩌면 누군가가 듣고있는 io.socket 서버 IP를 변경하는 더 나은 방법을 내게 줄 수 있습니까? (이 응용 프로그램은 Android 기본입니다.)

어떤 도움이나 조언도 주시면 감사하겠습니다.

답변

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(); 
+0

네 해봤 forceNew = TRUE; 옵션을 사용하지만 클라이언트는 여전히 첫 번째 서버에 연결되어 있습니다. 내 conf의 다른 점은 옵션 reconnect = true를 설정한다는 것입니다. 내 고객이 온라인 상태에서 다시 연결되도록해야합니다. 최신 버전으로 업데이트하려고하지 않았습니다. 곧 할 수 있습니다. – d324223

+0

버전 1.0.0으로 업데이트했으며, 옵션 reconection = false로 시도했습니다. 하지만 여전히 운이 .. 클라이언트가 새 서버에 연결하지만 여전히 새 서버의 메시지를 청취하지 않습니다 – d324223

+0

정적 메서드'socket = IO.socket ("http : // new_url");'을 사용 했습니까? 그리고 새로운 소켓에 연결하기 전에'socket.disconnect()'와'socket.off ("channel", EventEmitterAnonymousClass);를 호출 할 필요가있을 것이다. – MatPag

관련 문제