2017-10-04 44 views
0

私はソケットプログラミングの初心者です。私は、クライアントがユーザからファイル名を受け取り、それをサーバに送るプログラムを書く必要があります。サーバーは対応するファイルを読み取り、その内容をクライアントに送り返します。今私の問題は、サーバープログラムが 'String file = br.readLine()'でフリーズすることです。クライアントプログラムを終了すると、サーバーコードの行がさらに実行されます。私のクライアントコードの最後にwhileループをコメントアウトすると、サーバーコードは完全に正常に動作します(データは標準出力に出力されます)。私のコードで何が間違っているのかを教えてください。 サーバコード:サーバプログラムが 'String file = br.readLine()'という行でフリーズするのはなぜですか?

public class SocketServer { 

    public static void main(String[] args) throws Exception{ 
     System.out.println("Server is started."); 
     ServerSocket ss = new ServerSocket(9999); 

     System.out.println("Server is waiting for a client."); 
     Socket server = ss.accept(); 

     System.out.println("Client is connected."); 

     BufferedReader br = new BufferedReader(new InputStreamReader(server.getInputStream())); 
     String file = br.readLine(); 

     System.out.println("Requested file is: " + file); 

     OutputStreamWriter os = new OutputStreamWriter(server.getOutputStream()); 
     PrintWriter writer = new PrintWriter(os); 

     BufferedReader fr = new BufferedReader(new FileReader(file)); 

     String line; 
     while((line = fr.readLine()) != null) { 
      writer.write(line); 
      writer.flush(); 
      System.out.println(line); 
     } 
    } 
} 

クライアントコード:それは新しい行を見つけるまで

public class SocketClient { 

    public static void main(String[] args) throws Exception { 
     Scanner in = new Scanner(System.in); 
     Socket client = new Socket("localhost", 9999); 

     OutputStreamWriter os = new OutputStreamWriter(client.getOutputStream()); 
     PrintWriter writer = new PrintWriter(os); 

     System.out.print("Enter filename: "); 
     String file = in.nextLine(); 

     writer.write(file); 
     writer.flush(); 

     BufferedReader br = new BufferedReader(new InputStreamReader(client.getInputStream())); 

     System.out.println("Content of " + file + ":"); 

     String str; 
     while((str = br.readLine()) != null) { 
      System.out.print(str); 
     } 
     System.out.println("File transfer is complete."); 
    } 

} 
+0

デバッガが必要です。 – notyou

+0

私はデバッガを使用しました。それは私にサーバープログラムがフリーズする行を示しました。 –

答えて

3

br.readLine();は、入力を待ちます。

writer.write(file);改行せずにファイル名を書いています。

したがって、クライアントで改行文字を書き込むか、またはサーバーでcharによってcharを読み取るようにします。

これが役に立ちます。

+0

ありがとうございます。それは助けになった。 –

関連する問題