2017-03-26 12 views
1

天才。ソケット付きBufferedReaderおよびBufferedWriter

Javaでsocketを使いたいです。ここで

は私のサーバー側のコードの一部です:

ServerSocket ss = new ServerSocket(this.portNum); 
while (!ss.isClosed()) { 
    Socket socket = ss.accept(); 
    BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); 

    System.out.println("reading"); 
    StringBuffer sb = new StringBuffer(); 
    String line; 
    while ((line = br.readLine()) != null) { 
     sb.append(line); 
    } 
    System.out.println("read"); 

    System.out.println("writing"); 
    bw.write(this.wsp.parse(new String(sb.toString())).toJSONString()); 
    bw.newLine(); 
    bw.flush(); 
    System.out.println("wrote"); 

    bw.close(); 
    br.close(); 
    socket.close(); 
} 
ss.close(); 

そして、私のクライアント側(テスト)のコードは次のとおりです。

Socket socket = new Socket("143.248.135.60", 44450); 
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); 
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())); 

System.out.println("writing"); 
bw.write(str); 
bw.newLine(); 
bw.flush(); 
System.out.println("wrote"); 

System.out.println("reading"); 
StringBuffer sb = new StringBuffer(); 
String line; 
while ((line = br.readLine()) != null) { 
    sb.append(line); 
} 
System.out.println("read"); 

br.close(); 
bw.close(); 
socket.close(); 

双方は、印刷後に停止 "読書を。"

私のコードで何が問題になっていますか?

ご協力いただきありがとうございます。この時点で、サーバサイトで

答えて

1

アプリケーションブロック:ソースストリームがクローズされるまであなたのサーバは(ストリームの終わりに達したときbr.readLine()null戻ります)の行を読み込みます

while ((line = br.readLine()) != null) { 
    sb.append(line); 
} 

。しかし、これは起こりません。サーバはストリームソケットを閉じます:クライアント側の名前ループについて今

System.out.println("reading"); 
String line = br.readLine(); 
System.out.println("read"); 

:your'reはそうはなく、サーバー側でループのこれを試して、ここで1行だけを期待しているようです自らのデータを書いた直後。したがって、br.readLine()は、最初の行が読み取られた後にクライアント側でnullを返します。それであなたはあなたが期待していることをするでしょう。しかし、私がサーバー側に提案したようにコードを置き換えても機能します。

希望します。問題の解明に基づいて


編集(複数行を読む必要):

あなたの仕事に基づいて最も簡単な方法は、「送信終了」のような制御文字を使用することです(0x04 ASCIIに)。

クライアントコード:次の称賛につづく

System.out.println("writing"); 
bw.write("Hello"); 
bw.newLine(); 
bw.write("World"); 
bw.newLine(); 
bw.write(0x04); // EOT control character 
bw.newLine(); // This is needed for BufferedReader/Writer - even if we've used a EOT 
bw.flush(); 
System.out.println("wrote"); 

...

Serverコード:あなたはASCIIまたはUTF8を使用していない場合

while ((line = br.readLine()) != null && !(line.length() > 0 && line.charAt(0) == 0x04)) { 
    sb.append(line).append(System.lineSeparator()); 
} 

ご使用されるエンコーディングを確認してください正しい制御文字を選択します。

+0

回線を取得する必要がある場合はどうすればよいですか?スタンフォードパーサーは、文書、行のリストを解析できます。 –

+0

私は自分の答えを編集しました。 – maxikg

関連する問題