2012-04-04 11 views
0

私はファイル転送プログラムを持っています。プログラム(クライアント)は、TCPソケット経由でビットマップを送信するための操作を以下のん:スクリーンショットを取得 - >ストリームに変換 - - メモリから>グラブビットマップは、私は、画像を転送することを選択した場合>パラメータが無効です - C#でTCP経由でビットマップを送信するとエラーが発生します

 MemoryStream Fs = new MemoryStream(); 

//////////////11111 
     Bitmap bmp = TakeScreen(); 

///////////////2222 
     //Bitmap bmp = new Bitmap(@"C:\temp\001.bmp"); 


     bmp.Save(Fs, ImageFormat.Bmp); 
     Byte[] buffer = Fs.ToArray(); 

     Fs.Read(buffer, 0, buffer.Length); 
     TcpClient socket = new TcpClient("192.168.0.131", 1095); 

     NetworkStream nw = socket.GetStream(); 
     nw.Write(buffer, 0, buffer.Length); 
     nw.Close(); 
     Fs.Dispose(); 
     socket.Close(); 
     bmp.Dispose(); 
  • を送信しますメモリから直接 - エラーはありません。

  • ファイルから最初にビットマップをロードしようとすると、サーバー側で「パラメータが無効です」というエラーが発生します。ここ

は、サーバー側である:

    NetworkStream Nw = new NetworkStream(handlerSocket.Client); 
        int thisRead = 0; 
        int Blocksize = 1024; 
        Byte[] dataByte = new Byte[Blocksize]; 

        Bitmap screen = getScreen(Nw, dataByte, thisRead, Blocksize); 
        Nw.Close(); 

private Bitmap getScreen(NetworkStream Nw, Byte[] dataByte, int thisRead, int Blocksize) 
    { 
     Bitmap bitmap; 
     using (var strm = new MemoryStream()) 
     { 

      while (true) 
      { 
       thisRead = Nw.Read(dataByte, 0, Blocksize); 
       strm.Write(dataByte, 0, thisRead); 
       if (thisRead == 0) 
        break; 
      } 

      bitmap = new Bitmap(strm); // Error here 
     } 
     Bitmap bm3 = new Bitmap(bitmap); 
     bitmap.Dispose(); 
     return bm3; 
    } 

このエラーの原因は何?私はそれがMemoryStreamと関係があると思います。

編集:あなたはgetScreenBitmapを作成することができます前に、ストリームの先頭に求めることを旧姓質問

+0

送信しているバイナリ情報のサイズを含めるには、TCP通信を実際に変更する必要があります。現在、サーバーは、ビットマップを作成しようとする前に、完全なビットマップ情報を持っていない可能性があります。たとえば、ビットマップ情報を送る前に、ビットマップのサイズを 'long'として送信します。そうすれば、サーバーは予想されるバイト数を知ることができます。 –

答えて

1

を簡素化。

private Bitmap getScreen(NetworkStream Nw, Byte[] dataByte, int thisRead, int Blocksize) 
{ 
    Bitmap bitmap; 
    using (var strm = new MemoryStream()) 
    { 
     while (true) 
     { 
      thisRead = Nw.Read(dataByte, 0, Blocksize); 
      strm.Write(dataByte, 0, thisRead); 
      if (thisRead == 0) 
       break; 
     } 

     stream.Seek(0, SeekOrigin.Begin; // <-- Go Back to beginning of stream 
     bitmap = new Bitmap(strm); // Error here 
    } 
    Bitmap bm3 = new Bitmap(bitmap); 
    bitmap.Dispose(); 
    return bm3; 
} 

EDIT
詳細説明:ストリームに最後のバイトを書き込んだ後、ストリームの現在の位置がストリームの終わりです。画面からBitmapを作成すると、ストリームからビットマップを読み込もうとしますが、現在の位置(ストリームの最後)の後にデータがなくなるため、動作しません。

だから、ストリームの現在の位置をストリームの先頭に戻すようにストリームに指示する必要があります。そして、ビットマップ情報を読み出すことができる。

+0

"strm.Seek(0、SeekOrigin.Begin);"を追加しました。あなたが示唆したように、同じ行に同じエラーが発生します。Seek()を使わずにメモリからイメージを送信できるので、あなたが説明した問題が当てはまるかどうかはわかりません。 – Alex

+0

ビットマップをバイトとして取得するために書いたコードも奇妙です。ビットマップをメモリストリームに書き込んでいます。次に、メモリストリームのバイトバッファ(すでにビットマップのバイトが入っています)を取得し、*その後に冗長なストリーム*を再度読み込みます。おそらく、あなたは今、質問に私のコメントで書いたことの犠牲者です:ビットマップを作成しようとする前に、ビットマップ全体がサーバーに転送されていることを確かめますか?受信したコンテンツをファイルに保存してペイントして開こうとしたことがありますか? –

+0

niiice ..おそらく気が付かなかったかもしれませんが、あなたの投稿はちょうど私の問題を一度に解決する助けになりました。ストリームを2回連続して「読み込み」していたので、「//Fs.Read(buffer、0、buffer.Length);」とコメントしました。私の驚きの画像転送は完璧に機能しました!私はストリームからの直接転送がストリームの「2回目の読み込み」であっても "メモリ"から直接転送された理由はわかりません...サイドノートでは、はい、ペイント、Xnviewなどで画像を開きました。サイズ、寸法、色は、クライアントとサーバーで全く同じでした。とにかく、問題を解決し、あなたのアドバイス@Thorsten Dittmarに感謝します! – Alex

関連する問題