【问题标题】:Java TCP/IP socket send byte-aligned dataJava TCP/IP 套接字发送字节对齐的数据
【发布时间】: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 个浮点数和页脚发送到我的服务器?

干杯

【问题讨论】:

    标签: java matlab sockets tcp


    【解决方案1】:

    所以不要使用 PrintWriter。使用数据输出流。它具有发送浮点数和所有其他原语的方法。

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

    【讨论】:

      【解决方案2】:

      我相信你不应该使用 PrintWriter。

      尝试使用例如一个 ObjectOutputStream。

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

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

      【讨论】:

        猜你喜欢
        • 2020-12-03
        • 1970-01-01
        • 1970-01-01
        • 2019-05-07
        • 2016-05-09
        • 1970-01-01
        • 2012-11-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多