Java TCP / IP套接字发送字节对齐的数据

时间:2013-12-06 22:09:53

标签: java matlab sockets tcp

我很难通过套接字发送字节对齐的数据,因为我以后的示例使用了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个浮点数和页脚发送到我的服务器?

干杯

2 个答案:

答案 0 :(得分:2)

所以不要使用PrintWriter。使用DataOutputStream。它有发送浮点数和所有其他基元的方法。

'字节对齐'与它无关。所有数据都是字节对齐的。

答案 1 :(得分:1)

我相信你不应该使用PrintWriter
尝试使用例如一个ObjectOutputStream
http://docs.oracle.com/javase/7/docs/api/java/io/ObjectOutputStream.html

有了这个,你可以写字节,字符,浮点数,基本上是 任何东西(包括原始类型和对象)。
并且你没有通过字符串,你写二进制数据。

相关问题