2012-10-21 4 views
2

멀티 쓰레드 채팅 서버/클라이언트를 쓰고 있습니다. SocketTest V 3을 사용하여 서버를 테스트했는데 제대로 작동하는 것으로 보이지만 클라이언트는 나는 새 줄을 쓸 때 콘솔, 나는 소켓 테스트에 대해 내 자신의 클라이언트를 사용하고, 소켓 뭔가가 작성 될 때마다 업데이트하지만채팅 클라이언트 만 한 번에 한 줄씩 출력합니다.

public class clientV2 { 


public static final int PORT = 5019; 
public static InetAddress host; 

public static void main(String[] args) throws IOException { 

    try { 
     host = InetAddress.getLocalHost(); 
     Socket socket = new Socket(host, PORT); 

     Scanner in = new Scanner(System.in); 

     Scanner inputFromServer = new Scanner(socket.getInputStream()); 

     PrintWriter outputToServer = new PrintWriter(socket.getOutputStream()); 

     while(true) { 
      if(inputFromServer.hasNext()) { 
       System.out.println(inputFromServer.nextLine()); 
      } 

      String input = in.nextLine(); 
      outputToServer.println(input); 
      outputToServer.flush(); 

     } 

    } catch (Exception e) { 

    } 
} 

}

답변

1

당신의 클라이언트가 nextLine()를 호출하지 내 클라이언트가 않습니다 이 메소드는 이름에서 알 수 있듯이 다음 행을 리턴합니다. 따라서 클라이언트는 완전한 다음 행을 사용할 수있을 때까지 아무 것도 인쇄 할 수 없습니다.

다음은 javadoc에 대한 nextLine() 말씀입니다 : 현재 행 과거

발전이 스캐너와 가 생략되었다는 입력을 반환합니다. 이 메서드는 끝에 현재 줄 구분 기호를 제외한 나머지 현재 줄 을 반환합니다. 위치는 다음 행의 시작 부분으로 설정됩니다.

줄 구분 기호를 찾는 입력을 계속 검색하므로 줄 구분 기호가없는 경우 건너 뛸 줄 을 검색하는 모든 입력을 버퍼링 할 수 있습니다.

0

이것은 정확히 System.out.println(inputFromServer.nextLine());입니다. 그것은 전체 라인을 기다린 다음 출력합니다. 부분 행은 인쇄되지 않습니다.

출력이 마지막 부분 행 (줄 바꿈에서 줄 바꿈까지, 줄 바꿈은 포함되지 않음) 이상으로 누락 된 경우 길을 따라 버퍼를 찾습니다.

InputStreamReader을 사용하면 입력 스트림 (바이트 스트림)에서 단일 문자를 읽을 수 있습니다. 생성자에서 charset을 지정할 수 있습니다.

InputStreamReader inputFromServer = 
    new InputStreamReader(socket.getInputStream(), "UTF-8"); 

System.out.print((char) inputFromServer.read()); 
+0

나는 클라이언트가 무언가를 쓸 때마다 인쇄해야합니다. 어떻게해야합니까? – Martin

관련 문제