2

サーバー プログラムからクライアントにファイルを転送できません。私が対処したいいくつかの問題。まず、バイト配列を 6000 バイト大きくし、常にそのサイズにします。正しいファイル サイズを維持する方法はありますか? また、現在のコードでは、プログラムがハングします。クライアント側のwhileループから外すとうまくいきます。ヘルプ!!

クライアント:

 private void button1_Click(object sender, EventArgs e)
    {   
        BinaryWriter binWriter; 
        int i = -1;
        Byte[] bytes = new Byte[6000];

        NetworkStream clientStream = connTemp.GetStream();
        byte[] outstream = Encoding.ASCII.GetBytes(txtMessage.Text);
        clientStream.Write(outstream, 0, outstream.Length);


        while (i != 0)
        {
            try
            {
                if (clientStream.CanRead)
                {
                    i = clientStream.Read(bytes, 0, bytes.Length);

                }
            }

            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                break;
            }
        }


        binWriter = new BinaryWriter(File.Open("C:\\SeanLaunch\\log.rxlog",FileMode.Create));
        binWriter.Write(bytes);
        binWriter.Close();

    }

}

サーバ:

  Byte[] fileToSendAsByteArray = new Byte[6000];
  fileToSendAsByteArray = File.ReadAllBytes("C:\\Launch\\Test.rxlog");
  stream.Write(fileToSendAsByteArray, 0, fileToSendAsByteArray.Length);

編集!!!: ループの問題を修正しました。

4

2 に答える 2

3

1 つの問題は、ファイルから 1 バイトしか読み取っていない場合でも、ストリームに 6000 バイト全体を書き込んでいることです。

FileStreamを使用してファイルにアクセスし、コンテンツを NetworkStream にコピーします。Framework 4.0 には、このための優れた機能があります。

FileStream fs = new FileStream(...);
fs.CopyTo(stream);

クライアント側でも同様のアプローチを取ることができます。逆に、NetworkStream からターゲット ストリームにコピーします。

Framework 4.0 より前では、独自の CopyTo 関数を実装できます。このようなもの

public static long CopyStream(Stream source, Stream target)
{
  const int bufSize = 0x1000;
  byte[] buf = new byte[bufSize];

  long totalBytes = 0;
  int bytesRead = 0;

  while ((bytesRead = source.Read(buf, 0, bufSize)) > 0)
  {
    target.Write(buf, 0, bytesRead);
    totalBytes += bytesRead;
  }
  return totalBytes;
}
于 2010-09-07T23:12:30.747 に答える
1

i が非ゼロのときに CanRead が false のままである場合、プログラムは永久にループします。または、読み取り呼び出しでブロックされている可能性があります。

受信側をデバッグして、何が起こっているかを調べます。本当にハングしているのか、それとも単にループしているだけなのか?

両端で送受信されたデータをダンプするコードを追加して、問題が発生する前にどこまで問題なく読み取れたかを確認します。

于 2010-09-07T23:10:06.570 に答える