2015-06-27 2 views
3
public void read(byte[] bytess) 
{ 
     int davar = this.clientSocket.Receive(bytess); 
     MemoryStream m = new MemoryStream(bytess); 
     BinaryFormatter b = new BinaryFormatter(); 

     m.Position = 0; 
     SPacket information = b.Deserialize(m) as SPacket; 

     Image imageScreenShot = information.ScreenShot; 

     if (information.Premissionize) 
      Premitted = true; 

     if (information.Text != "") 
     { 
      cE.GetMessageFromServer(information.Text); 
     } 

     if (imageScreenShot == null) 
      return; 

     Bitmap screenShot = new Bitmap(imageScreenShot); 

     cE.UpdatePhoto(screenShot); 

     //screenShot.Dispose(); 
     //Form1.t.Text = forText; 
} 

У меня есть эта функция чтения в клиенте, и когда я запускаю ее в режиме онлайн между 2-мя компьютерами, происходит исключение десериализации.Как обеспечить получение всего пакета

Я предполагаю, что что-то задерживает весь пакет и только часть его прибыли. Он сказал, что двоичный заголовок недействителен.

Как я могу убедиться, что на C# у меня есть весь пакет?

Кстати это TCP

ответ

3

Приемный функция считывает по меньшей мере, один байт и максимум столько байт, сколько было отправлено. Прямо сейчас вы предполагаете, что одно чтение будет читать все, что не так.

Deserialize from new NetworkStream(socket). Это позволяет BinaryFormatter рисовать байты из сокета.

Что вы там написали о задержках пакетов, и это неточно. TCP защищает вас от этого.

+0

Теоретически вы правы. Но на самом деле я выбрасываю исключение десериализации, если что-то интродуцирует синхронизацию сервера и клиента, как окно сообщения. и несколько это происходит, когда его между двумя компьютерами в LAN через несколько секунд –

+0

, так что вопрос в том, как это предотвратить. –

+1

Вы прочитали ответ? Получатель может вернуть вам небольшой объем данных. Затем сериализатор будет жаловаться, потому что он получил частичные данные. Этот код неверен, и это вызывает проблему. – usr

Смежные вопросы