Java TCP套接字字节堆内存问题

时间:2015-11-11 15:22:21

标签: java sockets tcp heap-memory

我有一个Java TCP服务器套接字程序,期望来自一块远程硬件的大约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();
    }
}

这正确地从服务器端产生了这个输出:

enter image description here

但是,当我在Raspberry Pi上部署相同的服务器代码并且硬件向其发送数据时,数据长度会大得多并导致堆内存问题(即使将堆预设为512MB,这肯定是不正确和不必要的)

enter image description here

我的假设是我从TCP套接字读取数据错误,因为从硬件调试,它肯定不会发送这样大小的数据包。

更新:我无法访问客户端源代码。但是,我确实需要输入TCP数据流,将其放入字节数组,然后另一个函数(未显示)解析出一些已知的HEX代码。该函数需要一个字节数组输入。

更新:我查看了数据包文档。它是一个10字节的标题。第一个字节是协议标识符。接下来的2个字节是数据包长度(数据包中的总字节数,包括所有头字节和校验和),后7个是唯一ID。因此,我需要读取这2个字节并创建一个大小的字节数组。

1 个答案:

答案 0 :(得分:0)

显然,标题的长度约为1GB。看起来像另一端的问题。不要混合使用低/大端编码吗?