DOBON.NET DOBON.NETプログラミング掲示板過去ログ

NetworkStreamについて

環境/言語:[C#]
分類:[.NET]

お世話になってます。NetworkStreamについて質問させてください。
クライアント側でBitmapに画像を読込み、そのデータをMemoryStreamに保存し、NetworkStreamに書き込む。
サーバ側でNetworkStreamを読込み、MemoryStreamに保存し、Bitmapに書き込む。というのを作っています。
下記のプログラムで、ローカルホストでは正常に動作するのですが、サーバとクライアントに2台に分けて実行すると、
サーバ側の方にBitmap bmp = new Bitmap(m_stream);の部分で"一般的なGDI+の問題が発生しました"とエラーが出ます。
NetworkStream.Writeを数回に分けた方が良いのでしょうか?御指摘、お願いします。

クライアント側 *******************************************************

NetworkStream net_stream = tcp_client.GetStream();
MemoryStream m_stream = new MemoryStream();

Bitmap image = new Bitmap("../../image.bmp");
image.Save(m_stream, System.Drawing.Imaging.ImageFormat.Bmp);
byte[] buffer = m_stream.ToArray();

net_stream.Write(buffer, 0, buffer.Length);
net_stream.Flush();

サーバ側 ************************************************************

NetworkStream net_stream = tcp_client.GetStream();
MemoryStream m_stream = new MemoryStream();
byte[] buffer = new byte[1024];

do
{
net_stream.Read(buffer, 0, buffer.Length);
m_stream.Write(buffer, 0, buffer.Length);
m_stream.Flush();

}while(net_stream.DataAvailable);

Bitmap send_image = new Bitmap(m_stream);
#回答ではありません。

> 下記のプログラムで、ローカルホストでは正常に動作するのですが、サーバとクライアントに2台に分けて実行すると、
> サーバ側の方にBitmap bmp = new Bitmap(m_stream);の部分で"一般的なGDI+の問題が発生しました"とエラーが出ます。

 少し気になっただけですので、全くの的外れかも知れませんが‥‥

 m_stream の Length 値は期待する値になっているのでしょうか?

TCPクライアント・サーバープログラムを作成する
http://dobon.net/vb/dotnet/internet/tcpclientserver.html

の例では受信データ長の分だけ Write してますけど、ジャムさんのプログラムでは毎回バッファ長分 Write していますよね。不要な空データが書き込まれてしまっている可能性はありませんか?

 また、発生した例外に InnerException はありませんでしたか?
深山さんこんばんは。

ご指摘の通り、クライアント側MemoryStream.Lengthが12086に対して、サーバ側
MemoryStream.Lengthが12288となっており不要なデータが書き込まれていました。

PCを2台使用してクライアントとサーバを実行した場合にはサーバ側のMemoryStream.Lengthの[5119]までにしかデータが書き込まれていない状態である
事が分かりました。

今のソースでは問題点が多そうなのですが、原因はどこなのか?と行き詰っている
状況なので、ご指摘だけでも頂ければ幸いです。
■No11325に返信(ジャムさんの記事)
> ご指摘の通り、クライアント側MemoryStream.Lengthが12086に対して、サーバ側
> MemoryStream.Lengthが12288となっており不要なデータが書き込まれていました。
> PCを2台使用してクライアントとサーバを実行した場合にはサーバ側
> のMemoryStream.Lengthの[5119]までにしかデータが書き込まれていない状態である
> 事が分かりました。

データが増える方の理由は、深山さんが指摘したとおりでしょうね。修正方法
も深山さんが参照を提示されている、どぼん!さんのサンプルコードを読むと
分かりますよね。

データが減る方の理由は、NetworkStream.DataAvailable プロパティの使い方
にあるんじゃないでしょうか。どぼん!さんのサンプルコードでも、リファレ
ンスにあるサンプルコードでも、ジャムさんと同様の使い方をしているわけで
すが、DataAvailable プロパティでは受信すべきデータを全て受信したかどう
かを判断できないのでしょう。

DataAvailable プロパティが示しているのは、内部的な受信バッファに読み取
り可能のデータがあるかどうかだけですよね。リモートホストからのデータの
到着が滞ると、DataAvailable プロパティは false を返しそうです。

素直にソケットのシャットダウンで送受信の終了を表現するか、もし、シャッ
トダウンができない理由があるのなら、適当なプロトコルを考えるかするのが
いいんじゃないでしょうか。
  • 題名: Re[4]: NetworkStreamについて
  • 著者: ジャム
  • 日時: 2005/06/18 23:22:29
  • ID: 11341
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
おおたさんこんばんは。
アドバイスありがとうございます。私の実力でどこまで理解出来ているか
あやしいところですが、日曜日を使って取り組もうと思います。頑張ってきます。

DOBON.NET | プログラミング道 | プログラミング掲示板