У меня есть письменное приложение на сервере C++, с которым я хотел бы управлять Matlab. До сих пор я использовал функцию mex для связи сокетов, но я хотел бы отключить функцию mex и использовать встроенную Java непосредственно в m файлах. Это будет более оптимизированное решение.Связь сокетов между серверным приложением и клиентом Matlab с использованием Java
Мое автономное приложение на C++ ожидает сообщения со следующими данными в следующем порядке. , ,
Эта часть протокола является фиксированным и не может быть изменен:
uint32 magic_number - это магическое число (445566), который должен быть в начала сообщения или отдых сообщения будут проигнорированы.
UInt32 число_байт - это число байт, используемых для остальной части блока сообщений (исключая этих начальные 8 байт)
Эта часть протокола был разработан мной и может быть изменена:
Далее идет заголовок, выполненный из 4-х значений uint8 (как адрес iPv4) сигнализации в приложение, что представляет следующие данные (если какие-либо данные следующим образом)
После этого оставшиеся байты могут представлять разные вещи. Чаще всего это будет строка (значение ключа), за которой следует длинный массив значений с плавающей запятой (аудиоданные). Однако может быть просто строка, или они могут быть просто массивом значений с плавающей запятой. Значения 4 uint8 позволяют серверу знать, чего ожидать отсюда.
Как вы можете видеть, я в настоящее время сжимаю все в массив uint8 (колоссальный kludge). Это связано с тем, что функция «write» java ожидает, что массив байтов и массив 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-байтовыми сообщениями. Это протокол, который вы сами разработали? –