簡體   English   中英

Java TCP / IP套接字發送字節對齊的數據

[英]Java TCP/IP socket send byte-aligned data

我很難通過套接字發送字節對齊的數據,因為我一直遵循的示例使用PrintWriter類,該類將所有內容轉換為字符串表示形式。

我想發送3個浮點值,以及頁眉和頁腳。 這樣,用戶就可以准確地知道每次傳輸要讀取多少字節。 我的客戶發送如下內容:

//Add a header:
float type = params[0];
if (type == TransmitService.ACC_TYPE) out.print('a');
else if (type == TransmitService.GYR_TYPE) out.print('g');
else out.print('u'); //unknown - wtf? hasn't happened yet but just in case

//Payload:
out.print(params[1]);
out.print(params[2]);
out.print(params[3]);

//Footer:
out.print('e');

這是網絡對象的初始化:

echoSocket = new Socket(HOST, PORT);
out = new PrintWriter(echoSocket.getOutputStream(), true);

然后,在服務器端,我想做一次像正好讀取26個字節的操作(在64位系統上,每3個浮點數有8個字節,標頭字符為1個字節,頁腳字符為1個字節)。 確切的數字無關緊要,我可以測試並弄清楚。

有問題的是out.print()將所有內容都轉換為字符串,所以如果我有0.001000..並帶有結尾的零,它將截斷為0.001作為5個字符)的字符串,給我服務器的字節事務量不一致。

不幸的是,它在MATLAB中執行以下操作:

t=tcpip('0.0.0.0', 8000, 'NetworkRole', 'server');
fopen(t);

bytesToRead = 26;
data = fread(t,bytesToRead);

我應該怎么做才能一致地將頁眉,3個浮點數和頁腳發送到服務器?

干杯

因此,請勿使用PrintWriter。 使用DataOutputStream。 它具有發送浮點數和所有其他原語的方法。

“字節對齊”與它無關。 所有數據都是字節對齊的。

我相信您不應該使用PrintWriter。

嘗試使用例如ObjectOutputStream。

http://docs.oracle.com/javase/7/docs/api/java/io/ObjectOutputStream.html

有了這個,你基本上可以寫字節,字符,浮點數
任何東西(包括原始類型和對象)。
而且您不需要輸入字符串,而是編寫二進制數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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