2017-06-10 6 views
3

私はC#を使用してWindows用のソフトウェアを作成し、Javaでクライアントソフトウェアを作成しています。 ほとんどの場合、私が理解していない例外を除いては問題ありません。TCP送受信に欠けているバイト

私はバイナリデータを送信しようとしない限り、一般的に通信に両端の.ReadLine()と.WriteLine()を使用しています。バイトを直接書き込んだり読んだりしています。

  1. クライアントは、クライアントが長さを受け取り、整数に変換し、
  2. 文字列としてバイナリデータの長さと
  3. サーバーが応答するバイナリデータを要求: これは、ソフトウェアが作業を想定している方法です読み取りを開始する(長さ)は
  4. 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); 
} 
+0

Javaクライアントでは、ループを通過するときに 'PROCESSED'の値は何ですか?私はこれがなぜ興味があるのか​​というと、なぜ10,000バイトを読み込むと2048バイトが短いのか不思議です。各反復で2048バイトを読み込んでいるので、ループを最後に読み取るときに1808を読み込むことが期待されます。 – Poosh

+0

@Poosh 10,000バイトが例でした。私は今私のPCにはないので、私はあなたに推定値を与えることができます、私は正確な値を後で再びコメントします。 PROCESSED値は常に1440または2048のいずれかで増分され、最後には〜700だけ増分されます。その時点で、正確に2048バイトの読み込みが残っていますが、クライアントには到着しません。 – detus

+0

更新:いくつかのログがあります: 作業中ダウンロード:https://pastebin.com/hFd5TvrF ダウンロードに失敗しました:https://pastebin.com/Q3zFWRLB – detus

答えて

0

以下は、サーバーとクライアントの両方のソースコードがあります。今のところ、サーバーはバイト配列を送信した後、長さを送信します。何らかの理由でこれは機能しません。

それでは、私が変更したことである:

  1. 送信長
  2. スタートなぜバイト

を書いわからない "OK" で応答するクライアントを待ちますが、できます。それはwhile(true)ループで実行しています。データは4分で1000回も問題なく送信されているので、修正されています。

関連する問題