2010-01-18 7 views
1

2 개의 중요한 클래스 (클라이언트와 서버)가 있고 텍스트 영역에 뭔가를 쓰고 보내기 버튼을 클릭하여 클라이언트 클래스의 활성 메서드를 호출하고 클라이언트 클래스에 모든 텍스트를 보냅니다. 것은 괜찮아요 그 텍스트는 또한 서버 콘솔에 인쇄됩니다하지만 서버에서 클라이언트로 텍스트를 에코 수 없습니다, 제발 도와주세요.서버에서 아무 것도 반환하지 않습니다!

클라이언트 클래스 :(그 일부) 그 일부)

 BufferedReader streamIn = new BufferedReader(new InputStreamReader(client.getInputStream())); 
     PrintWriter streamOut =new PrintWriter(client.getOutputStream()); 
     boolean done = false; 
     String line =null; 
     while (!done) { 

      line = streamIn.readLine(); 
      if (line.equalsIgnoreCase("bye")) { 
       done = true; 
      } else { 
       System.out.println(line); 
       streamOut.println(line); 
      } 
     } 

     streamIn.close(); 
     client.close(); 
     server.close(); 
+0

또한 멀티 스레드 클라이언트/서버 응용 프로그램입니다. – Johanna

+0

Johanna,이 질문은 세 번째 질문입니다.나는 "EchoClient"또는 "EchoServer"에 대한 구글을 제안하여 실제 예제를 찾아 그 주위에 코드를 빌드하십시오. 한 톤의 코드를 붙여 놓은 다음 사람들이 당신을 위해 그것을 디버깅 할 것을 기대하는 것은 다른 사람의 시간을 사용하는 것이 아닙니다. – Adamski

+0

고마워, 문제가 해결되었습니다 [:-)] – Johanna

답변

1

실제로 Nettogrof 올바른 길을 가고,하지만 당신은 또한 서버 측 플러시해야합니다

 line = streamIn.readLine(); 
     if (line.equalsIgnoreCase("bye")) { 
      done = true; 
     } else { 
      System.out.println(line); 
      streamOut.println(line); 
      streamOut.flush(); // or ...checkError(); 
     } 

을하거나의 autoflush와의 PrintWriter true로 설정 작성 :

PrintWriter streamOut = new PrintWriter(client.getOutputStream(), true); 

한 참고 : 클라이언트가 "bye"를 보내지 않고 연결을 닫을 것이므로 readLine()이 null을 리턴하는지 테스트해야합니다.

두 번째 메모 : PrintWriter의 인스턴스가 IOException을 발생시키지 않으면 오류를 테스트하여 checkError()을 호출하여 스트림을 플러시해야합니다.

+0

답장을 보내 주셔서 감사합니다. – Johanna

0

확인이 Sun Tutorial On Client Server이, 마지막 부분에이

가 BTW 멀티 스레딩에 대해 이야기 :(

os = new PrintWriter(c.getOutputStream(), true); 


is = new BufferedReader(new InputStreamReader(c.getInputStream())); 

public static void active() { 

String teXt = MainClient.getText(); 

os.println(teXt); 

String line = is.readLine(); 
     System.out.println("Text received: " + line); 
     os.flush(); 
     is.close(); 
     is.close(); 
     c.close(); 

서버 클래스

0

입력 스트림을 읽는 빈도는 어느 정도입니까? 코드에서 보면 단일 읽기가있는 것처럼 보입니다. 아마도 서버에서 보내지는 모든 것이 있기 때문입니다. 당신이 취한 접근법을 사용하려고한다면 아마 서버의보다 일관된 폴링을해야 할 것입니다. 같은

뭔가 :

while (line = is.readLine() != null) { 
    System.out.println("Text received: " + line); 

}

+0

나는 그것을했지만 여전히 클라이언트의 콘솔에 아무것도 반환하지 않습니다. – Johanna

1

당신을 "os.flush를();"해야하는 서버의 대답을 읽기 전에. 그런 다음 서버에 텍스트를 보낼

String line = is.readLine(); 
System.out.println("Text received: " + line); 

:

클라이언트 코드에 따라, 당신은 당신이에 의해 서버의 응답을 기다립니다 그리고

String teXt = MainClient.getText(); 

os.println(teXt); 

로 보내 텍스트를 준비하기 때문에

os.flush(); 

시도 :

String teXt = MainClient.getText(); 

os.println(teXt); 
os.flush(); 
String line = is.readLine(); 
System.out.println("Text received: " + line); 
+0

작동하지 않습니다 !! – Johanna

+0

실제로 printWriter는 autoFlush가 활성화 된 상태에서 생성됩니다 :'os = new PrintWriter (c.getOutputStream(), true);'그래서 println 다음에 flush를 호출 할 필요가 없습니다. –

0

서버 코드 구현이 잘못되었습니다. 무한 루프로 인해 streamIn, client 및 streamOut이 절대로 닫히지 않습니다.

자세한 내용은 medopal에 언급 된 기사를 참조하십시오.

관련 문제