【发布时间】:2013-12-06 22:09:53
【问题描述】:
我很难通过套接字发送字节对齐的数据,因为我一直关注的示例使用 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 个浮点数和页脚发送到我的服务器?
干杯
【问题讨论】: