TCP ソケットからすべてのデータを取得する際に問題が発生しています。
私のサーバーでは、次のようなソケットからデータを読み取っています。
int len;
byte[] buffer = new byte[2000];
try {
this.in = new DataInputStream(this.socket.getInputStream());
this.out = new DataOutputStream(this.socket.getOutputStream());
running = true;
while (running) {
len = in.read(buffer);
if (len < 0) {
running = false;
} else {
parsePacket(buffer, len);
}
}
} catch (IOException ex) {
System.out.println("Catch IOException: " + ex);
ex.printStackTrace();
} finally {
try {
System.out.println("Closing");
in.close();
out.close();
socket.close();
} catch (IOException ex) {
System.out.println("Finally IOException: " + ex);
}
}
パケット形式は次のようになります。
[ヘッダー][データ][ターミネーター]
- ヘッダー --> メッセージの開始を識別する一連の文字 (パケットの長さに関する情報はありません)。
- データ --> 次のようにセグメントに分割されます。[サイズ セグメント。1][データセグメント。1][サイズ区分。2][データセグメント。2][サイズ区分。3][データセグメント。3]....[サイズ区分。N][データセグメント。N]
- ターミネータ --> [0x00]
データは非常に高速に受信されるため (200 ミリ秒以下の場合もあります)、次のようなメッセージが表示されることread(buffer)
があります。buffer
- [HEADER1][DATA1][TERM1] または、
- [HEADER1][DATA1][TERM1][HEADER2][DATA2][TERM2].............[HEADER N][DATA N][TERM N]または、
- [HEADER1][DATA1][TERM1][HEADER2][DATA2][TERM2].............[HEADER N][DAT (最後のメッセージが不完全)
このparsePacket()
メソッドは、上記の形式のメッセージを解析することができ、次にさらにメッセージがある場合は、それらも (再帰的に) 解析されます。ただし、最後のメッセージが不完全な場合は解析されません (それは望ましくありませんが、今まで適切な解決策が見つかりませんでした)。
メッセージ内のデータは、MySQL データベースに保存されます (JDBC ドライバーを使用)。メッセージの各解析には、データベースへの複数のクエリが含まれる場合があります。データの受信、解析、保存に 1 つのスレッドしか使用していないため、コードの実行は本来の速度よりも速くありません...データはできるだけ早く受信して保存する必要があります。
私が議論したいいくつかの点:
- メッセージの一部を失うことなくすべてのメッセージを取得するための最良の方法は何でしょうか?
- データを受信して保存する方法を改善するにはどうすればよいですか? (データはできるだけ早く保存する必要があります!)