[英]Java TCP Socket Byte Heap Memory Issue
我有一個Java TCP Server Socket程序,期望從一個遠程硬件中獲得大約64字節的數據。 服務器代碼為:
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();
}
}
這樣可以正確地從服務器端產生以下輸出:
但是,當我在Raspberry Pi上部署相同的服務器代碼並且硬件向其發送數據時,數據長度會大大增加,並且會導致堆內存問題(即使Heap預先設置為512MB,這絕對是不正確和不必要的) )
我的假設是我從TCP套接字讀取了錯誤的數據,就像從硬件進行調試一樣,它肯定不是在發送這種大小的數據包。
更新:我無權訪問客戶端源代碼。 但是,我確實需要將輸入的TCP數據流放入一個字節數組中,然后另一個函數(未顯示)解析出一些已知的HEX代碼。 該函數需要一個字節數組輸入。
更新:我查看了數據包文檔。 它是一個10字節的標頭。 第一個字節是協議標識符。 接下來的2個字節是數據包長度(數據包中的字節總數,包括所有標頭字節和校驗和),最后7個字節是唯一ID。 因此,我需要讀取這2個字節並創建一個具有該大小的字節數組。
顯然,從標頭開始的長度約為1GB。 看起來在另一端的問題。 您不混合低/大端編碼嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.