2015-08-16 2 views
1

Я пытаюсь отправить изображение по NetworkStream это мой код клиента:NetworkStream не отвечает

private void Form1_Load(object sender, EventArgs e) 
    { 

     TcpClient client=new TcpClient(); 
     client.Connect("127.0.0.1", 10); 
     NetworkStream ns = client.GetStream(); 
     Bitmap screen = GetDesktopImage();//generate a screenshot. 
     MemoryStream ms = new MemoryStream(); 
     screen.Save(ms, ImageFormat.Png); 

     byte[] byteCount = BitConverter.GetBytes((int)ms.Length); 

     ms.Position = 0; 
     ns.Write(byteCount, 0, byteCount.Length); 
     ms.CopyTo(ns); 
     ms.SetLength(0); 



    } 

это сервер:

private void Start() 
    { 
     TcpListener listen = new TcpListener(IPAddress.Any, 10); 
     listen.Start(); 

     NetworkStream ns = new NetworkStream(listen.AcceptTcpClient().Client); 
     byte[] temp = new byte[4]; 
     ns.Read(temp, 0, 4); 
     int count = BitConverter.ToInt32(temp, 0); 
     byte[] buff = new byte[count]; 
     pictureBox1.Image = Image.FromStream(ns); 

    } 


    private void Form1_Load(object sender, EventArgs e) 
    { 
     Thread th = new Thread(Start); 
     th.Start(); 

    } 

Я не вижу ничего на PictureBox и Я предполагаю, что программа висит здесь: pictureBox1.Image = Image.FromStream(ns); просто добавил точку останова, и она не работает. ** Только когда я закрываю клиентскую программу и останавливаю отладку, я могу видеть изображение на картинке на стороне сервера. Почему это? Любые идеи?

+0

* pictureBox1.Image = Image.FromStream (ns); просто добавлена ​​точка останова и она не работает * - Означает ли это, что она никогда не попадает в точку останова или не проходит мимо нее? – Amit

+0

Это не проходит мимо. прежде чем он будет работать. @Amit – Slashy

+0

DId вы пытаетесь захватить байты вместо 'buff'? – Amit

ответ

0

Я предполагаю, что Image.FromStream не знает, чтобы прекратить чтение, когда оно нарисовало полное изображение. Возможно, формат PNG даже не позволяет этого. Вы должны дать поток Image.FromStream, который имеет ограниченный размер. Самый простой способ - использовать BinaryReader.ReadBytes(count) для чтения точного количества необходимых байтов.

ns.Read(temp, 0, 4);: Это ошибка, потому что предполагается, что чтение вернет ровно 4 байта. Это может быть не так. Опять же, используйте BinaryReader.ReadInt32, чтобы безопасно прочитать int.

Еще лучше, отказаться от пользовательских форматов сериализации и использовать что-то вроде длины протобуфа с префиксом. Или, HTTP или WCF.

+0

никогда не работал раньше с http или wcp .. так что я думаю, что это то, что я буду использовать :) У меня есть другой вопрос, действительно похожий и связанный с этим. должен ли я открыть новую проблему или я могу только отредактировать сообщение выше, и вы можете мне помочь? Спасибо за все! @usr – Slashy

+0

Вы можете задать свой вопрос прямо здесь, в комментариях. – usr

+0

На самом деле я хочу отправить дополнительную информацию об изображении, например местоположение, на которое оно должно быть нарисовано. например (400, 829). оба являются int.do Мне нужно написать каждый ns.write (// число, преобразованное в байт) и использовать сеть каждый раз, или я могу записать его в обычный «запоминающий файл», а не копировать весь контент? @usr – Slashy