2016-11-06 3 views
0

내 Java websocket에 연결이 끊긴 후 즉시 닫고 싶습니다.Java websocket - 즉시 닫으십시오

서버 연결이 서버 클래스에서으로 onOpen 방법으로 폐쇄 된

@ClientEndpoint 
public class Client { 

public static void main(String[] args) { 

    WebSocketContainer container = null; 

    container = ContainerProvider.getWebSocketContainer(); 
    try { 
     Session session = container.connectToServer(Client.class, URI.create("ws://localhost:8080/WebsocketServer/server")); 
    } catch (DeploymentException | IOException e) { 
     e.printStackTrace(); 
    } 

} 

@OnOpen 
public void onOpen(Session p) { 
    try { 
     for (int i = 0; i < 10; i++) { 
      p.getBasicRemote().sendText("Hello! "); 

      try { 
       Thread.sleep(500); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 

     } 
     p.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

@OnClose 
public void OnClose() { 
    System.out.println("Client connection closed"); 
} 

있지만

@ServerEndpoint(value = "/server") 
public class Server { 
private static final long serialVersionUID = 1L; 
private Session session; 

@OnOpen 
public void onOpen(Session session) throws IOException { 
    System.out.println("Server Websocket open"); 
    this.session = session; 
    try { 
     session.close(new CloseReason(CloseCodes.NORMAL_CLOSURE, "No Token")); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

} 


@OnMessage 
public void onMessage(String message) { 
    System.out.println("server receives: "+message); 
} 

@OnClose 
public void onClose(Session session) { 
    System.out.println("Server session closed"); 
    session = null; 
} 

클라이언트는 여전히 클라이언트로부터 메시지를 수신합니다.

server receives: Hello! 
server receives: Hello! 
server receives: Hello! 
server receives: Hello! 
... 

닫기 방법이 호출되었지만 여전히 연결이 열려 있고 메시지를받는 이유는 무엇입니까?

답변

0

정상적으로 ws 연결을 닫는 것이 비동기 프로세스이기 때문에. 서버가 닫기 메시지를 보내지 만, 서버가 클라이언트로부터의 닫기 응답을 수신 할 때까지 연결이 닫히지 않습니다. 당신의 관찰을 감안할 때, 고객이 이미 10 'Hello!' 심지어 메시지가 서버에서 닫기 메시지를 처리하기 시작하기 전에. 따라서 서버가 문제가되지 않는 한 연결은 여전히 ​​열려 있기 때문에 "서버가 수신합니다"라는 메시지가 인쇄됩니다.

관련 문제