【发布时间】: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