2010-02-05 7 views
1

임은 기본적으로 다음 클라이언트가 다음 리스너가 먼저 문자열 "@의 AUTH의 @"을 전송하도록하는 방식으로 전송을 초기화 연결로 영원 즉시 등에 포트에서 수신하고 리스너를 만드는 clien이 응답합니다. '접속'ServerSocket 클래스의 목적자바 소켓 문제

while(true){ 


try { 


    Socket incoming=connection.accept(); 
    while(!incoming.isClosed()) 
    { 
     out = new PrintWriter(incoming.getOutputStream(), true); 
     in = new BufferedReader(new InputStreamReader(incoming.getInputStream())); 
     BufferedInputStream is = new BufferedInputStream(incoming.getInputStream()); //inputstream to get data from the socket 
     BufferedReader stdIn = new BufferedReader(new InputStreamReader(System.in)); 
     out.println("@[email protected]"); 
} 
} 
catch(Exception e){} 
} 

를 다음과 같이 상기위한

내 코드 세그먼트이다. 인스턴트 메신저 hyoperterminal를 사용하여 내 코드를 테스트 할 때 이제 포트와 첫 번째 연결에 연결하는 등의 메신저, 문자열 "@의 AUTH의 @"가 표시하지만 내가 하이퍼 터미널을 사용하여 해당 포트에서 분리하고, 다시 문자열 "을 연결하면 @ AUTH @ "가 표시되지 않습니다. 기본적으로이 문자열은 클라이언트가 전체 인증 프로세스의 시작 역할을 할 때마다 해당 포트에 연결할 때마다 표시되어야합니다.

모든 포인터는 큰 도움이 될 것입니다.

키아라

답변

1

나는 당신이 어떤 데이터도 읽지 않는다고 생각한다. 하이퍼 터미널 (예를 들어 텔넷 협상 코드) 아무것도를 보낸 경우 여전히 소켓에서 읽을 데이터가, 그래서 아마 폐쇄로 치료되지 않습니다. 따라서 귀하의 코드는 여전히 첫 번째 연결을 처리하고 있으며 새로운 연결을 수락하지 않습니다. 이외에도 더 적절하게 각 연결을 처리에서

, 당신 수도 각 연결에 대해 새 스레드를 생성하는 소원 - 하나 개의 연결이 이미했습니다 당신이 다시 연결할 수 없습니다 "사용 중"입니다 현재 상태 본.

로깅을 사용하여이 모든 것을 확인할 수 있어야합니다 ... 로깅 또한 예외가 발생했는지 표시해야합니다 : 예외를 잡으면 삼키는 것이 무엇이 진행되고 있는지에 관해 훨씬 더 힘들게 만듭니다 에.

0

코드는 이해가되지 않습니다.

(a) 소켓을 닫을 때 Socket.isClosed()가 true를 반환합니다. (b)이 루프 주위마다 새로운 입력 및 출력 스트림을 생성한다. 그것들은 한 번 만들어야합니다.