У меня есть программа 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();
}
}
И это правильно производит этот выход со стороны сервера:
Однако, когда я развертываю один и тот же код сервера на малине Pi, и оборудование отправляет ему данные, длина данных намного больше, а c auses проблема с кучей памяти (даже с кучей предварительно установленной на 512MB, который, безусловно, неверно и ненужно)
Моя презумпция я читаю данные неправильно из TCP сокета, как из отлаживать от аппаратное обеспечение, это, конечно же, не отправка пакетов такого размера.
Обновление: У меня нет доступа к исходному коду клиента. Однако мне нужно взять входной поток данных TCP, поместить его в массив байтов, а затем другая функция (не показана) анализирует некоторые известные коды HEX. Эта функция ожидает ввода байтового массива.
Обновление: Я рассмотрел документацию по пакету. Это 10-байтовый заголовок. Первый байт является идентификатором протокола. Следующие 2 байта - это длина пакета (общее количество байтов в пакете, включая все байты заголовка и контрольную сумму), а последние 7 - уникальный идентификатор. Поэтому мне нужно прочитать эти 2 байта и создать массив байтов такого размера.
Как вы отправляете данные с устройства? Если readInt() возвращает 1253831317, кажется, что вы действительно отправляете шестнадцатеричные значения 4B 01 60 05 (что не похоже на кодировку «64», о которой я знаю). Мои предложения: используйте что-то вроде [Wireshark] (https://www.wireshark.org/), чтобы убедиться, что отправленные данные на самом деле вы ожидаете. –
Данные выдаются как HEX, насколько я знаю. Могу ли я настроить распределение байтов для учетной записи? – Colin
Является ли длина 75 приемлемой для протокола (если длина отправляется как один байт, это будет первый байт)? Знаете ли вы структуру данных или длину отправки? –