从unix服务器到纯数据服务器的TCP/IP通信
我对从Unix服务器到纯数据的TCP/IP通信感兴趣。我在Unix服务器端使用套接字实现了它,在纯数据端使用netclient实现了它。为此,我利用了聊天服务器教程(3.Networking>10.chat\u client.pd) 现在的问题在于,服务器将数据以“字符串”消息的形式流式输出,消息以“;”分隔 我的问题是,是否有一种方法可以将字符串消息以外的内容发送到纯数据,如字节流或序列化数字流?纯数据能接收这样的消息吗? 由于字符串需要太多字节才能传输,例如,数字“1024;”已经是5个字节,而这样的整数只有4个字节 更新:对于所有在寻找答案时偶然发现这篇文章的人 显然,纯数据端的[netclient]只能接收;分隔消息。 因此,上述问题的解决方案是: 我的问题是,是否有一种方法可以将字符串消息以外的内容发送到纯数据,如字节流或序列化数字流?纯数据能接收这样的消息吗? 解决方案是使用[tcpclient],它可以接收字节流数据 现在我的问题是,如何获得四个紧凑的数字 现在我有一系列字节,至少顺序正确 我正在从UNIX服务器发送一个结构从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个字节
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),因为我在