2015-11-11 3 views
0

У меня есть программа Java Socket Socket Socket, которая ожидает около 64 байтов данных из части удаленного оборудования. Код Сервер:Ошибка Java Socket Byte Heap Memory

public void run() throws Exception 
{ 


    //Open a socket on localhost at port 11111 

    ServerSocket welcomeSocket = new ServerSocket(11111); 

    while(true) { 

     //Open and Accept on Socket 

     Socket connectionSocket = welcomeSocket.accept(); 
     DataInputStream dIn = new DataInputStream(connectionSocket.getInputStream()); 


     int msgLen = dIn.readInt(); 
     System.out.println("RX Reported Length: "+ msgLen); 
     byte[] msg = new byte[msgLen]; 

     if(msgLen > 0) { 
      dIn.readFully(msg); 

      System.out.println("Message Length: "+ msg.length); 
      System.out.println("Recv[HEX]: " + StringTools.toHexString(msg)); 
     } 
    } 
} 

Это работает правильно, как я могу проверить локально с помощью простой программы ACK:

public class ACK_TEST { 

    public static void main (String[] args) 
    { 

     System.out.println("Byte Sender Running"); 


     try 
     { 
      ACK_TEST obj = new ACK_TEST(); 
      obj.run(); 
     } 
     catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 


    } 


    public void run() throws Exception 
    { 

     Socket clientSocket = new Socket("localhost", 11111); 
     DataOutputStream dOut = new DataOutputStream(clientSocket.getOutputStream()); 

     byte rtn[] = null; 
     rtn = new byte[1]; 
     rtn[0] = 0x06; // ACK 


     dOut.writeInt(rtn.length); // write length of the message 
     dOut.write(rtn);   // write the message 

     System.out.println("Byte Sent"); 
     clientSocket.close(); 
    } 
} 

И это правильно производит этот выход со стороны сервера:

enter image description here

Однако, когда я развертываю один и тот же код сервера на малине Pi, и оборудование отправляет ему данные, длина данных намного больше, а c auses проблема с кучей памяти (даже с кучей предварительно установленной на 512MB, который, безусловно, неверно и ненужно)

enter image description here

Моя презумпция я читаю данные неправильно из TCP сокета, как из отлаживать от аппаратное обеспечение, это, конечно же, не отправка пакетов такого размера.

Обновление: У меня нет доступа к исходному коду клиента. Однако мне нужно взять входной поток данных TCP, поместить его в массив байтов, а затем другая функция (не показана) анализирует некоторые известные коды HEX. Эта функция ожидает ввода байтового массива.

Обновление: Я рассмотрел документацию по пакету. Это 10-байтовый заголовок. Первый байт является идентификатором протокола. Следующие 2 байта - это длина пакета (общее количество байтов в пакете, включая все байты заголовка и контрольную сумму), а последние 7 - уникальный идентификатор. Поэтому мне нужно прочитать эти 2 байта и создать массив байтов такого размера.

+0

Как вы отправляете данные с устройства? Если readInt() возвращает 1253831317, кажется, что вы действительно отправляете шестнадцатеричные значения 4B 01 60 05 (что не похоже на кодировку «64», о которой я знаю). Мои предложения: используйте что-то вроде [Wireshark] (https://www.wireshark.org/), чтобы убедиться, что отправленные данные на самом деле вы ожидаете. –

+0

Данные выдаются как HEX, насколько я знаю. Могу ли я настроить распределение байтов для учетной записи? – Colin

+0

Является ли длина 75 приемлемой для протокола (если длина отправляется как один байт, это будет первый байт)? Знаете ли вы структуру данных или длину отправки? –

ответ

0

По-видимому, длина от заголовка составляет около 1 ГБ. Похож на проблему на другом конце. Разве вы не смешиваете кодировку с низким/большим эндиантом?

+0

1GB определенно неправильно с этого устройства: D Если низкий/большой был заменен, могу ли я его объяснить? – Colin

+0

Ну, большой/маленький эндиан не помог бы здесь, все равно это было бы беспорядок. Однако не посылает ли клиент только один байт или BER сжатый int как длина? У вас есть источники для клиента? –

+0

У меня нет доступа к исходному коду клиента.Однако мне нужно взять входной поток данных TCP, поместить его в массив байтов, а затем другая функция (не показана) анализирует некоторые известные коды HEX. – Colin