2017-01-14 6 views
1

私は過去数日間C#でTcpClientを使用する方法を学び、tcpで文字列(メッセージ)を送信できました。今日は、テキストファイルを送信しようとしました(つまり、クライアントがファイルを受信して​​同じフォルダに書き込むことになりました)。それは1つの問題を除いて働いた - メッセージの後にTONのヌルバイトがある。ここで私が何を意味するかです:TCPを介してファイルを送信するときに余分なNullバイトがたくさんあります

元のテキストファイルの内容:http://i.imgur.com/UCO3jvL.png

受信したテキストファイルの内容:http://i.imgur.com/6vucz40.png

私は、受信したファイルのサイズを見て、そして長さは65536の文字でした。私は、TCPパケットの最大サイズが65535であることを知っています。私の考えでは、自分のコードのなかには、必要な量だけではなく、パケットの最大サイズを使用するものがあります。ここで

は、クライアントにファイルを送信し、サーバからの私のコードです:ここでは

 if(message.Contains("getFile")) 
     { 
      byte[] fileBytes = File.ReadAllBytes("text.txt"); 
      stream.Write(fileBytes, 0, fileBytes.Length); 
     } 

は、サーバーからファイルを受信し、ディスクに書き込み、クライアントのために私のコードです:

 if(command.Contains("getFile")) 
     { 
      byte[] readBuffer = new byte[client.ReceiveBufferSize]; 
      int data = stream.Read(readBuffer, 0, readBuffer.Length); 
      File.WriteAllBytes("file.txt", readBuffer); 
     } 
+0

そのない程度TCPは、私が思うに、あなたの 'client.ReceiveBufferSize'どのくらいいるのですか?あなたはあなたのファイルに多くのバイトを書きます –

+0

私が間違っていない場合、client.RecieveBufferSizeはファイルの長さと同じに設定する必要がありますか? – rrrrrrrrrrrrrrrr

答えて

2

あなたの問題は、あなたがネットワークをスキップして、ちょうど行う場合でも、あなたは完全にあなたがネットワークから得たデータの量を無視しているということです。

byte[] readBuffer = new byte[client.ReceiveBufferSize]; 
File.WriteAllBytes("file.txt", readBuffer); 

あなたはゼロの束でファイルになります。

あなたのアカウントにstream.Readの戻り値を取る必要があります:すべての

using (BinaryWriter binWriter = new BinaryWriter(File.Open("file.txt", FileMode.Create))) 
{ 
    binWriter.Write(readBuffer, 0, data); 
} 
+0

ありがとう!これはそれを解決しましたが、あなたは "ネットワークから得たデータの完全性を完全に無視している"ということをどのように説明することができますか?私はちょっと混乱しています。 – rrrrrrrrrrrrrrrr

+0

、 'stream.Read'はネットワークから読み込んだバイト数を返しますが、決してその数値を使用したことはありません。実際に受け取ったバイト数にかかわらず、あなたが割り当てたバッファに書き込む 'WriteAllBytes'を呼び出していました。なぜ私はあなたにバッファのサイズについて聞いていたのですか? 'client.ReceiveBufferSize'はどこにありますか? –

+0

ああ、私はあなたが意味するものを見ます - 私は 'データ'変数で何もしませんでした。私はFile.WriteAllBytesがこのような状況には適していないと思います。 – rrrrrrrrrrrrrrrr

関連する問題