【发布时间】:2012-01-25 17:59:18
【问题描述】:
我有一个编写的 C++ 服务器应用程序,我希望能够从 Matlab 控制它。到目前为止,我已经使用 mex 函数进行套接字通信,但我想放弃 mex 函数并直接在 m 文件中使用内联 Java。这将是一个更精简的解决方案。
我的基于 C++ 的独立应用程序需要按以下顺序包含以下数据的消息。 . .
这部分协议是固定的,不能更改:
uint32 magic_number - 这是一个幻数 (445566),必须在 消息的开头或消息的其余部分将被忽略。
uint32 num_bytes - 这是用于消息块其余部分的字节数 (不包括这最初的 8 个字节)
这部分协议是我设计的,可以修改:
接下来是由 4 个 uint8 值组成的标头(如 ipv4 地址) 向应用发出以下数据表示的信号(如果后面有任何数据)
在此之后,剩余的字节可以代表许多不同的东西。 最常见的是一个字符串(键值),后跟一长串浮点值(音频数据)。但是,可能只有一个字符串,或者它们可能只是一个浮点值数组。 4 个 uint8 值让服务器知道这里会发生什么。
如您所见,我目前正在将所有内容压缩到一个 uint8 数组中(一个巨大的组合)。这是因为 java“write”函数需要一个字节数组,而 Matlab uint8 数组是一种兼容的数据类型,正如我在 Mathworks 网站 Passing Data to a Java Method 上使用下表时发现的那样
我不是 Java 程序员,但今天下午我已经设法编写并运行了一段非常简单的通信代码。谁能帮我把它做得更好?
import java.net.Socket
import java.io.*
mySocket = Socket('localhost', 12345);
output_stream = mySocket.getOutputStream;
d_output_stream = DataOutputStream(output_stream);
data = zeros(12,1,'uint8');
%Magic key: use this combination of uint8s to make
% a uint32 value of = 445566 -> massive code-smell
data(1) = 126;
data(2) = 204;
data(3) = 6;
%Size of message block:
%total number of bytes in following message including header
%This is another uint32 i.e. (data(5:8))
data(5) = 4;
%header B: a group of 4 uint8s
data(9) = 1;
data(10) = 2;
data(11) = 3;
data(12) = 4;
%Main block of floats
%????
d_output_stream.write(data,0,numel(data));
pause(0.2);
mySocket.close;
我已经尝试发送一个由我想发送的数据的不同部分组成的 java 对象,但我不确定它们最终是如何在内存中排序的。在 C/C++ 中,很容易将不同的数据类型附加到连续的内存块中,然后发送。我有一种简单的方法可以在 Java 中做到这一点吗?我最终也想进行双向通信,但这可以等到现在。感谢阅读。
【问题讨论】:
-
当我在 Matlab 和 Java 之间发送数据时,我发送带有必要属性的 java 对象。也许你可以试试。
-
你能缩小“许多不同的事情”的范围吗?它的组件是否总是一个原始数字数组或其他可以直接表示为 Matlab 原始数组的东西?你需要从服务器取回数据吗?
-
你确定“消息块的大小”是一个字节吗?这会将您限制为 256 字节的消息。这是您自己设计的协议吗?
-
我已更新问题以涵盖这些问题中提出的一些观点。感谢您的关注。
-
在字符串(键值)后面跟着浮点数的情况下,服务器怎么知道字符串有多长,浮点数有多长?该 4 字节标头是否编码长度,或者您是否使用固定长度?您可能需要更多子标题。查看 MAT 文件格式 doco 以了解有关 Matlab 本身如何执行此操作的示例:mathworks.com/help/pdf_doc/matlab/matfile_format.pdf
标签: java c++ sockets matlab interprocess