私はC#を使用してWindows用のソフトウェアを作成し、Javaでクライアントソフトウェアを作成しています。 ほとんどの場合、私が理解していない例外を除いては問題ありません。TCP送受信に欠けているバイト
私はバイナリデータを送信しようとしない限り、一般的に通信に両端の.ReadLine()と.WriteLine()を使用しています。バイトを直接書き込んだり読んだりしています。
- クライアントは、クライアントが長さを受け取り、整数に変換し、
- 文字列としてバイナリデータの長さと
- サーバーが応答するバイナリデータを要求: これは、ソフトウェアが作業を想定している方法です読み取りを開始する(長さ)は
- Serverが書き込みを開始バイト(長さ)バイト
それはほとんどの場合に動作しますが、時にはクライアントアプリは完全なデータaとbを受信しませんロック。サーバーは常にデータを書き込んだ後すぐにフラッシュするため、フラッシュは問題ではありません。
さらに、私はこれが通常大きなファイルで起こることに気付きました。小さなファイル(〜1 MBまで)は通常問題ではありません。それは、C#のサーバのように思える
NOTEは完全にデータを送信し、その問題は、Javaコードのどこかに最も可能性が高いです。
EDIT - ここではいくつかのログは、クライアント側からです
ワーキングをダウンロード:pastebin.com/hFd5TvrF
失敗ダウンロード:pastebin.com/Q3zFWRLB
クライアントは、2048バイトを待っているように思え最後に(この場合はlength - processed = 2048
)、何らかの理由でクライアントがブロックされます。
私が間違っていることは何ですか?
C#のサーバー:
public void Write(BinaryWriter str, byte[] data)
{
int BUFFER = 2048;
int PROCESSED = 0;
// WriteString sends the String using a StreamWriter (+ flushing)
WriteString(data.Length.ToString());
while (PROCESSED < data.Length)
{
if (PROCESSED + BUFFER > data.Length)
BUFFER = data.Length - PROCESSED;
str.Write(data, PROCESSED, BUFFER);
str.Flush();
PROCESSED += BUFFER;
}
}
Javaクライアント:私は修正を見つけた
public byte[] ReadBytes(int length){
byte[] buffer = new byte[length];
int PROCESSED = 0;
int READBUF = 2048;
TOTAL = length;
progress.setMax(TOTAL);
InputStream m;
try {
m = clientSocket.getInputStream();
while(PROCESSED < length){
if(PROCESSED + READBUF > length)
READBUF = length - PROCESSED;
try {
PROCESSED += m.read(buffer, PROCESSED, READBUF);
} catch (IOException e) {
}
XPROCESSED = PROCESSED;
}
} catch (IOException e1) {
// Removed because of sensitive data
}
return decryptData(buffer);
}
Javaクライアントでは、ループを通過するときに 'PROCESSED'の値は何ですか?私はこれがなぜ興味があるのかというと、なぜ10,000バイトを読み込むと2048バイトが短いのか不思議です。各反復で2048バイトを読み込んでいるので、ループを最後に読み取るときに1808を読み込むことが期待されます。 – Poosh
@Poosh 10,000バイトが例でした。私は今私のPCにはないので、私はあなたに推定値を与えることができます、私は正確な値を後で再びコメントします。 PROCESSED値は常に1440または2048のいずれかで増分され、最後には〜700だけ増分されます。その時点で、正確に2048バイトの読み込みが残っていますが、クライアントには到着しません。 – detus
更新:いくつかのログがあります: 作業中ダウンロード:https://pastebin.com/hFd5TvrF ダウンロードに失敗しました:https://pastebin.com/Q3zFWRLB – detus