2013-04-04 5 views
0

Я хотел создать проект для потоковой передачи нескольких изображений через сеть. Я просто хотел начать с небольшого функционального кода, но уже столкнулся с проблемой фанки для меня. Изображение получено, но оно содержит графические ошибки, такие как его только часть.«Артефакты» при потоковой передаче изображений в C#

К сожалению, изображения с изображениями невелики, поэтому ссылка. 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); 

ответ

3

stream.Read не гарантирует, что он будет читать data.Length байт. Вместо этого он возвращает количество прочитанных байтов. Поэтому вы должны проверить его возвращаемое значение и продолжить чтение, пока не получите все байты.

См http://msdn.microsoft.com/en-us/library/system.io.stream.read(v=vs.90).aspx (раздел Return Value)

Thr чтения метод может быть что-то вроде этого

void Read(Stream stream, byte[] buffer,int offset,int len) 
{ 
    int read = 0; 
    while (read < len) 
    { 
     read += stream.Read(buffer, offset + read, len-read); 
    } 
} 
+0

Да, это работало, спасибо много! Мой плохой, я думал, что stream.Read будет ждать, пока он прочитает все необходимые данные. – ShirouWrath