2016-04-29 13 views
0

私はServerSocketを使用してwhileループでクライアントからデータを取得しますが、最初の実行時には動作しますが、2回目以降は失敗します。ServerSocketはループ内にデータを受け取りません

検索しましたが、まだ何が起こったのか把握できません。

サーバー側のコード

package com.gorilla.main; 

import java.io.IOException; 
import java.io.InputStream; 
import java.net.ServerSocket; 
import java.net.Socket; 

public class Server2 { 

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

     ServerSocket serverSocket = new ServerSocket(44444); 

     while(true){ 

     System.out.println("another round"); 

     Socket socket = serverSocket.accept(); 
     InputStream inputStream = socket.getInputStream(); 

     System.out.println("available: "+ inputStream.available()); 

     byte[] b = new byte[inputStream.available()]; 

     inputStream.read(b); 

     System.out.println(new String(b)); 
     System.out.println("======================="); 

     socket.close(); 
     } 
    } 
} 

Clent側のコード

package com.gorilla.main; 

import java.io.IOException; 
import java.net.Socket; 
import java.net.UnknownHostException; 

public class Client2 { 

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

     Socket socket = new Socket("127.0.0.1", 44444); 
     String s = "Hello World"; 
     byte [] b = s.getBytes(); 
     socket.getOutputStream().write(b);; 
     socket.close(); 

    } 
} 

とサーバー側のコンソールに出力私は、クライアントを3回走った後。

another round 
available: 11 
Hello World 
======================= 
another round 
available: 0 

======================= 
another round 
available: 0 

======================= 
another round 

いずれかの提案をいただければ幸いです。ありがとう。

答えて

2

バッファサイズを調整するのにInputStream.available()を使用します。これは、ソケットから読み取る方法ではありません。あなたがバッファを割り当てる必要があります(通常は静的なサイズ、または多分設定可能)とInputStream.available():

のJavadocのを読み込むことができるバイト数の推定値を返します

// server code 
byte[] buffer = new byte[4096]; 
int bytesRead; 
while ((bytesRead = in.read(buffer)) > -1) { 
    // do something 
} 

ループで読み取る(または はスキップされます)。この入力ストリームのメソッドの次の呼び出しによってブロックされることはありません。次の呼び出しである は、同じスレッドまたは別のスレッドである可能性があります。 の単一の読み取りまたはスキップは、この多くのバイトをブロックしませんが、より少ないバイトを読み取ったりスキップしたりすることがあります。

あなたのプロトコルはテキストベースである場合、あなたはScanner内ソケットの入力ストリームをラップすることができますので、ループが

while (scanner.hasNextLine()) { 
    String line = scanner.next(); 
} 
+0

なりそれは動作します。しかし、なぜ私はinputStream.available()が0のときにinputStreamから何かを読み取ることができますか?アイデアはありますか? –

+0

お返事ありがとうございます! –

+0

あなたのユースケースは 'available()'を必要としません。 (それはブロッキングコールです)を読み、タイムアウトを設定してください – Raffaele

関連する問題