簡體   English   中英

Java TCP套接字字節堆內存問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM