0

ネット経由で複数の画像をストリーミングするためのプロジェクトを作成したかったのです。小さくて機能的なコードから始めたかっただけですが、すでにファンキーな問題に遭遇しました。画像を受信しましたが、一部だけのようなグラフィックのバグが含まれています。

悲しいことに、評価が低いために画像を表示できません。リンクは次のとおりです。 http://img543.imageshack.us/img543/1508/buggedy.jpg

もちろん、答えは百万ドルです。^^

TcpListener listener;
TcpClient client;
TcpClient datatoclient;
NetworkStream stream;

ホスト部分:

listener = new TcpListener(5000);
listener.Start();
datatoclient = listener.AcceptTcpClient();
NetworkStream nowystream = datatoclient.GetStream();

MemoryStream ms = new MemoryStream();
byte[] image = File.ReadAllBytes("default.jpg");

switch (trackBar1.Value)
{
      case 0:
          image = File.ReadAllBytes("mirrion.jpg");
          break;
      case 1:
          image = File.ReadAllBytes("tenis.jpg");
          break;
      case 2:
          image = File.ReadAllBytes("marisasold.jpg");
          break;
}


// get the image size in bytes
int numberOfBytes = image.Length;

// put the size into an array
byte[] numberOfBytesArray = BitConverter.GetBytes(numberOfBytes);

// send the image size 
nowystream.Write(numberOfBytesArray, 0, numberOfBytesArray.Length);

// send the image 
nowystream.Write(image, 0, numberOfBytes);

クライアント部分:

client = new TcpClient("127.0.0.1", 5000);
stream = client.GetStream();

byte[] data = new byte[4];
// read the size
stream.Read(data, 0, data.Length);
int size = BitConverter.ToInt32(data, 0);
label1.Text = size.ToString();

// prepare buffer
data = new byte[size];

// load image
stream.Read(data, 0, data.Length);

// save image to file for test
File.WriteAllBytes("received.jpg", data);

MemoryStream MS = new MemoryStream(data);

pictureBox1.Image = Image.FromStream(MS);
4

1 に答える 1

3

stream.Readdata.Lengthバイトを読み取ることを保証するものではありません。代わりに、読み取ったバイト数を返します。そのため、戻り値を確認し、すべてのバイトを取得するまで読み続ける必要があります。

http://msdn.microsoft.com/en-us/library/system.io.stream.read(v=vs.90).aspx (セクションReturn Value)を参照してください。

Thr read メソッドは次のようになります

void Read(Stream stream, byte[] buffer,int offset,int len)
{
    int read = 0;
    while (read < len)
    {
        read += stream.Read(buffer, offset + read, len-read);
    }
}
于 2013-04-04T17:07:49.567 に答える