【问题标题】:Data not displayed correctly when read from TCP socket Java从 TCP 套接字 Java 读取时数据显示不正确
【发布时间】:2020-03-10 10:06:27
【问题描述】:

我是 Java 套接字和进程的新手。我正在尝试从 TCP 套接字读取信息,但是当我收到数据时,某些信息未正确显示。 (我认为这可能是编码问题,我正在读取的进程是 Genivi DLT 守护进程)。

这是我的代码示例:

try (Socket socket = new Socket(hostname, port)) {

            InputStream input = socket.getInputStream();
            InputStreamReader reader = new InputStreamReader(input);

            BufferedReader br1 = new BufferedReader(reader);         

            String line;


            while((line = br1.readLine())!=null) {
                String s = br1.readLine();
                byte[] utf8Bytes = s.getBytes("UTF-8");
                if(s.contains("SYS"))
                    System.out.println(s);
            }

这是the data that should be displayed的照片。

这是它实际显示到控制台的方式:

ÒWAVAè5ÓrQSYS ² (PathologyCollectorCPU.cpp: getLoad(...)@69): {"Name": "Core", "cpuName": "cpu0", "percent": 33, "totalUser": 1533306, "totalNice:" 0, "totalSys": 1216838, "totalIdle": 5681926}

有人知道为什么会这样,或者我应该采取一些方法来解决我的问题吗?

编辑: 经过一番挖掘,我想我已经找到了有关该协议的一些信息,在这里:https://www.autosar.org/fileadmin/user_upload/standards/foundation/1-0/AUTOSAR_PRS_DiagnosticLogAndTraceProtocol.pdf 第 16 页。如果您有更多建议,将不胜感激。

【问题讨论】:

  • 看起来你得到了原始数据。尝试取前四个字节并将其转换为整数
  • 您正在以文本行的形式读取数据,但它看起来不像是在发送文本行。您需要找出它使用的协议并正确解析它。
  • 你正在扔掉每一个奇怪的行。摆脱对readLine() 的内部调用。如果数据不是行,不要使用readLine(),如果不是文本,不要使用Reader。
  • 你能推荐一些其他的方法来读取输入流吗?我应该使用扫描仪吗?
  • 除非是文本。您必须分解并告诉我们输入流中的实际情况。

标签: java sockets bufferedreader dlt-daemon


【解决方案1】:

您正在使用 TCP(传输控制协议),它通过流在网络上发送数据。所以你需要为你发送的每个包定义“数据长度”。

当客户端/服务接收到该数据流时,它会根据“data-length”值准确读取包的字节数。

您可以查看下面的示例以获取更多详细信息:

private void __updateRecvHeaderData(byte[] bytes) {
    if (bytes.length >= Constants.HEADER_BYTES) { // header length
        byte[] header = Arrays.copyOfRange(bytes, 0, Constants.HEADER_BYTES);
        __dataSize = MessagePacker.byteToShort(header); // network to host short
        __recvHeader = false;
        // package = |2 bytes header| <content bytes> |
        byte[] data = Arrays.copyOfRange(bytes, Constants.HEADER_BYTES, __dataSize + Constants.HEADER_BYTES);
        __onRecvData(data); // recursion
    }
}

文件类可以在这里找到:TCP receive and split the stream data by data-length

【讨论】:

  • OP 正在使用未公开性质的现有协议。它可能有也可能没有长词。
  • “未公开的性质”所以即使你不知道,你也将我的答案标记为“无用”的答案。
  • 你不知道是谁标记了你的答案,协议未公开并不意味着你可以随意重新定义它。
  • 经过一番挖掘,我想我已经找到了有关该协议的一些信息,在这里:autosar.org/fileadmin/user_upload/standards/foundation/1-0/… 第 16 页。如果您有更多建议,将不胜感激。
  • @LiviuIosim 该信息应该在您的问题中,当然不在此必将被删除的答案下。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-02
  • 2010-10-14
  • 1970-01-01
  • 2011-02-26
  • 2016-02-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多