从unix服务器到纯数据服务器的TCP/IP通信

从unix服务器到纯数据服务器的TCP/IP通信,unix,networking,client-server,puredata,Unix,Networking,Client Server,Puredata,我对从Unix服务器到纯数据的TCP/IP通信感兴趣。我在Unix服务器端使用套接字实现了它,在纯数据端使用netclient实现了它。为此,我利用了聊天服务器教程(3.Networking>10.chat\u client.pd) 现在的问题在于,服务器将数据以“字符串”消息的形式流式输出,消息以“;”分隔 我的问题是,是否有一种方法可以将字符串消息以外的内容发送到纯数据,如字节流或序列化数字流?纯数据能接收这样的消息吗? 由于字符串需要太多字节才能传输,例如,数字“1024;”已经是5个字节

我对从Unix服务器到纯数据的TCP/IP通信感兴趣。我在Unix服务器端使用套接字实现了它,在纯数据端使用netclient实现了它。为此,我利用了聊天服务器教程(3.Networking>10.chat\u client.pd)

现在的问题在于,服务器将数据以“字符串”消息的形式流式输出,消息以“;”分隔

我的问题是,是否有一种方法可以将字符串消息以外的内容发送到纯数据,如字节流或序列化数字流?纯数据能接收这样的消息吗?

由于字符串需要太多字节才能传输,例如,数字“1024;”已经是5个字节,而这样的整数只有4个字节

更新:对于所有在寻找答案时偶然发现这篇文章的人

显然,纯数据端的[netclient]只能接收;分隔消息。 因此,上述问题的解决方案是: 我的问题是,是否有一种方法可以将字符串消息以外的内容发送到纯数据,如字节流或序列化数字流?纯数据能接收这样的消息吗?

解决方案是使用[tcpclient],它可以接收字节流数据

现在我的问题是,如何获得四个紧凑的数字 现在我有一系列字节,至少顺序正确

我正在从UNIX服务器发送一个结构

typedef struct {
    int     var_code;
    int    sample_time;
    int     hr;
    float    hs;
} phy_data;
样本数据可能为2 1000000 51 2000.56

当接收并打印纯数据时,我得到如下输出:

:0 0 0 2 0 10 114 26 0 0 0 51 0 16 242 78

你可以清楚地注意到数字2和数字51,我想其他的也都是正确的

如何将这些数字恢复为可用格式?
可能是使用[bytes2any]和[route]进行了一些操作,但我无法使用它提取数据?

以下是您必须执行的操作的概要:

  • 将bytelist重新打包为各种类型的大小正确的小消息

    由于所有元素都是4字节长的,所以只需将列表(或ByTestStream,因为TCP/IP不能保证将16字节作为单个列表交付,但也可以决定将其拆分为任意长度的列表)重新打包到多个4个atom列表中

    最稳定的方法可能是首先序列化列表(检查[list]帮助中的“serializer”示例),然后将该列表重新配置为4个元素

    如果你可以使用像zexy这样的外部语言,你可以使用[Repack4]来实现

    如果您信任[netclient]将消息作为完整列表输出,则只需使用一个大的[unpack….]和4个[pack]即可

  • 解释每个子列表的原始数据

    整数很简单,浮点数要复杂得多

整数:

    |
    [unpack 0 0 0 0]
    |      |   |   |
    [<< 8] |   |   |
    |      |   |   |
    [+     ]   |   |
    |          |   |
    [<< 8]     |   |
    |          |   |
    [+         ]   |
    |              |
    [<< 8]         |
    |              |
    [+             ]
    |
|
[解包0]
|      |   |   |

[解决问题的真正办法是使用定义良好的应用层协议,而不是自己编写

在Pd等应用中使用最广泛的协议当然是

要将原始OSC字节解码为Pd消息,请使用[Unpack OSC](属于“mrpeach”库的一部分;在Debian上,您可以通过
Pd OSC
软件包进行安装)

在“服务器”端,您可以使用来编码数据并发送数据

笔记 请注意,由于OSC是基于数据包的,您需要为基于流的协议(如TCP/IP)提供数据包化机制。与OSC-1.2一样,这应该是。
liblo
应该已经解决了这一问题。请查看[unpack OSC]附带的补丁,了解如何在Pd中实现这一点


如果您使用UDP作为传输,则不需要所有这些。

整数
1000000
应转换为
0 15 66 64
,而不是
0 10 114 26
(如果您的字节顺序是big-endian(网络传输的默认值),则为684570),因为我在