我是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}
有人知道为什么会这样吗,或者我应该采取一些解决问题的方法?
编辑: 经过一番挖掘后,我认为我在第16页的https://www.autosar.org/fileadmin/user_upload/standards/foundation/1-0/AUTOSAR_PRS_DiagnosticLogAndTraceProtocol.pdf中找到了有关该协议的一些信息。如果您还有其他建议,将不胜感激。
答案 0 :(得分:-1)
您正在使用TCP(传输控制协议),它通过流通过网络发送数据。因此,您需要为发送的每个数据包定义“数据长度”。
当客户端/服务接收到该数据流时,它基于“数据长度”值来准确读取包的字节数。
您可以查看以下示例以了解更多详细信息:
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