2011-09-27 3 views
0

그래서 자바로 소켓이있는 서버와 클라이언트를 만들었습니다. 나는 소켓에서 읽기/쓰기로 서버를 얻으려고하지만, 클라이언트가 연결을 끊 만 읽Java - 클라이언트가 연결을 끊을 때까지 소켓이 읽히지 않습니까?

 System.out.println("Server initialized"); 
     clientSocket = server.accept(); 
     System.out.println("Client connected"); 

     PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); 
     BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 

     for(int loop = 0;loop<5;loop++){ 
      out.write("Hello"); 
      System.out.println(in.readLine()); 
     } //end for 

문제는 클라이언트가 연결되면, 그것이 말하는 한 다음 "클라이언트 연결"하지만 것입니다 for 루프를 통해 실행되지 않습니다. 그러나 클라이언트가 연결을 끊으면 서버는 for 루프를 실행하고 반환합니다.

null 
null 
null 
null 
null 

여기서 내가 무엇을 놓치고 있습니까?

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.PrintWriter; 
import java.net.ServerSocket; 
import java.net.Socket; 

public class Server { 
    public ServerSocket server; 

    public Server(int port){ 
     try { 
      server = new ServerSocket(port); 
     } catch (IOException e) { 
      System.out.println("Cannot bind to port: "+ port); 
      System.exit(-1); 
     } 

    } //end constructor 

    public void WaitForClient() throws IOException{ 
     Socket clientSocket = null; 

     try { 
      System.out.println("Server initialized"); 
      clientSocket = server.accept(); 
      System.out.println("Client connected"); 

      PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); 
      BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 

      for(int loop = 0;loop<5;loop++){ 
       out.write("Hello"); 
       System.out.println(in.readLine()); 
      } //end for 

     } //end try 
     catch (IOException e) { 
      System.out.println("Accept failed"); 
      System.exit(-1); 
     } //end catch 

     clientSocket.close(); 
     server.close(); 

    } //end method 

} //end class 

을 (내 주요 방법은 다른 클래스에서 호출됩니다.) 즉시 결과를 확인하려는 경우 서버에서 스트림을 플러시해야

답변

1

: 여기 내 전체 서버 코드입니다. 스트림이 close()에서 자동으로 플러시되므로 출력을 확인한 것입니다.

+0

어디 플러시를 추가? 내 for 루프에서? –

+0

예,'out.write' 후 – michael667

+0

글쎄, 지금은 읽기,하지만 여전히'null'을 반환합니다 : S –

1

처음에는 개행이 발생하지 않았으므로 in.readLine()에 대한 호출이 차단 된 것처럼 보입니다.

따라서 연결이 끊어 질 때까지 차단됩니다.

의 BufferedReader의 읽기 방법을 시도해보십시오

public int read(char[] cbuf, 
     int off, 
     int len) 

와 같은 고정 길이 배열 전달 : 많은 바이트가 마지막에 얼마나

char[] cbuf = new char[1024]; 

를 사용하여 읽기 호출의 반환 값은 참조하십시오 read (0-1024) 1024를 읽으면 읽을 가능성이 더 높습니다. 0을 읽으면 읽을 가능성이 더 없습니다.

1

줄을 읽었지만 쓰지는 않았습니다. write()는 개행을 작성하지 않고 readLine()은 수신 할 때까지 차단합니다.

-1

서버 측 문자열을 받아들이는 코드 클라이언트에서 코드를 사용하지만 PrintWriter 및 BufferedReader 대신 DataInputStream 및 DataOutputStream을 사용합니다.

이 코드는 완전히 하나 이상의 클라이언트에 대한 작동 .. "JTA"코드에서

는 JTextArea에 ..

SOC = server.accept()이고; (참)

동안은

{

 String data=""; 
      try 
      {     
       dis = new DataInputStream(soc.getInputStream()); 
       dos = new DataOutputStream(soc.getOutputStream()); 
       data = dis.readUTF(); 
      } 
      catch(Exception e) 
      { } 
      jta.append(data + "\n"); 
     } 
+0

그는 * have * 해당 스트림을 사용합니다. 대체 솔루션입니다. – EJP

관련 문제