TCPを使用してサーバーに接続する簡単なソケットアプリを作成しています。時々 2 バイト値を読み取る必要があるため、すべて次のようになります。
public byte[] read(int bytes)
{
byte b[] = new byte[bytes];
try {
in.read(b); //in is InputStream from properly connected Socket.getInputStream()
return b;
} catch (IOException e) {
return null;
}
}
この関数は、指定されたバイト数を受け取り、それを配列で返す必要があります。問題は、残りが利用可能になる前に 1 バイトを読み取り、奇妙なデータを返すことがあるということです。
byte a[]=read(2); //Program is blocked here untill some bytes arrive...
System.out.prntln(a[0]); //always correct
System.out.prntln(a[1]); //unprintable character (probably 0 or -1)
私の簡単な修正は、読み取るのに十分なデータがあるかどうかを確認する while ループを追加することでした。
public byte[] read(int bytes)
{
byte b[] = new byte[bytes];
try {
while (in.available()<bytes); //It does the thing
in.read(b);
return b;
} catch (IOException e) {
return null;
}
}
しかし、そのループはプロセッサの能力 (実際には 1 つのコア) を 100% 使用しているため、非常に厄介です。その関数を書き直す方法はありますか (param と戻り値はまったく同じでなければなりません)、正しく動作しますか?
事前にサンクス:)