繁体   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