сокеты c # & java и байтовые данные читают накладные расходы - PullRequest
3 голосов
/ 02 ноября 2011

Я получаю байтовые данные с сервера VNC, используя Real VNC, это работает в моем методе / функции:

byte[] readBytes = new byte[count];
sock.Receive(readBytes);

Использование TigerVNC не работает, но это:

byte[] readBytes = new byte[count];      

byte[] aByte = new byte[1];

for (int i = 0; i < count; i++)
{
    sock.Receive(aByte);    
    readBytes[i] = aByte[0];
}                            

Я наткнулся на это довольно быстро, так как, когда я использовал точки останова, исходный код был в порядке с Tight VNC, без прерывания были получены только первые два байта. Мой сокет блокируется и имеет размер приема 1024. Однако я работаю с сервером и клиентом локально, поскольку у меня нет другого способа тестирования.

Вопрос:

Кроме использования дополнительного байта памяти с "aByte" и итерации по X байтам. Есть большая разница в обработке, чем просто получение его напрямую с помощью Socket.Receive? Учитывая, что в какой-то момент я, возможно, получу МБ данных.

Более того, это будет реализовано в Blackberry как Java-приложение, будет ли такой же метод иметь смысл обработки в Java Mobile?

ура, Крейг

1 Ответ

4 голосов
/ 02 ноября 2011

Ни один из этих методов не особенно хорош.Что вы хотите сделать, так это продолжать вызывать Recv до тех пор, пока он не прочитает все нужные вам байты или не выдаст ошибку.Каждый раз передайте ему указатель сразу после полученных вами байтов и количества оставшихся байтов.

Посмотрите на метод Socket.Receive на этой странице.Суть заключается в следующем (упрощенно):

public static void Receive(Socket socket, byte[] buffer, int size)
{
 int received = 0;
 do
 {
  try
  {
   received += socket.Receive(buffer, received, size - received, SocketFlags.None);
  }
  catch (SocketException ex)
  {
   throw ex;  // any serious error occurr
  }
 } while (received < size);
}

Таким образом, вы не возвращаетесь слишком быстро, но также не читаете данные побайтно.

...