Использование функции Winsock "send" в Java (или аналогичной)



У меня есть ощущение, что моя проблема немного странная, но вот она...



У меня есть программа на C++ (из другой организации), которая взаимодействует с камерой, подключенной к аппаратному обеспечению через Ethernet с помощью сокетов. На первый взгляд, исходная функция, которая отправляет сообщение в сокет, выглядит следующим образом:



char* cmd = "#TRGONx0d";
m_pClient->Socket_Write( (BYTE*)cmd, strlen( cmd ));


Покопавшись в коде, я нашел функцию на самом нижнем уровне, которая действительно отправляет данные:



// Try to send what's in the buffer
int nFlags = 0;
int nSent = ::send( m_hSocket, (char*)m_pSendBuffer, m_nSendBufLen, nFlags );
...checking for errors, etc.


Теперь программа, над которой я работаю, должна отправить аналогичное сообщение. команда для камеры, за исключением того, что она написана на Java. Я играл с Java-сокетами весь день и не смог заставить камеру делать что-либо, кроме подключения к соответствующему адресу (команда там, чтобы вызвать светодиодные огни).



Я искал в интернете и увидел, что эта команда "отправить" из библиотеки Winsock, которую инкапсулирует программа C++. Есть ли подобный способ сделать это в Java? Или я просто не использую правильную комбинацию Потоки данных, сокеты и т. д. на Яве? Есть ли какой-то "импорт winsock", который я пропускаю (Гугл, кажется, говорит, что такой вещи нет)?



Большое Спасибо за любую помощь.



Правка:



Я действительно не знаю, поможет ли какой-нибудь код! На данный момент я просто делаю основные вещи: подключаюсь и пытаюсь писать к нему. Я, кажется, перепробовал все комбинации, преобразования и т. д. Это просто некоторый тестовый код (очевидно, не надежный или правильный, как блок catch):



InetAddress addr = null;
Socket sock = null;
ObjectInputStream in = null;
ObjectOutputStream out = null;

String msg = "#TRGON\x0d";

try {
addr = InetAddress.getByAddress(new byte[] { (byte) 192, (byte) 168,
(byte) 81, (byte) 58 });

sock = new Socket(addr, PORT);

out = new ObjectOutputStream(sock.getOutputStream());

out.writeBytes(msg);

in = new ObjectInputStream(sock.getInputStream());

} catch (IOException e) {
e.printStackTrace();
}


Это висит на последней строке там, in = new ... как будто он не принимает какой-либо входной поток от камеры. Я знаю, что могу продолжать играть с ним, но любой совет извне ценится.

613   3  

3 ответов:

В общем, это должно быть так же просто, как:

Socket s = new Socket("hostname", port);
OutputStream os = s.getOutputStream();
os.write("#TRGON\r".getBytes());
os.flush();
Так в чем же именно заключаются ваши проблемы? Конечно, если соединение выглядит символьным, вы не должны использовать DataOutputStream, а вместо этого писать в него простые ASCII-строки.

[edit: заменил \x0d на \r]

Похоже, что C++ принимает простые байты. Поэтому вы должны сделать то же самое с Java:

InetAddress addr = InetAddress.getByName("192.168.81.58");
Socket s = new Socket(addr, PORT);
OutputStream out = s.getOutputStream();
out.write("#TRGON\\x0d".getBytes());
s.close();

Это так же грубо, как и получается, я полагаю.

Оказалось, что для отправки командной строки требуется другой формат. Вместо

"#TRGON\x0d"

Мне нужно было использовать

"#TRGON\r"

Не нуждался в шестнадцатеричном спецификаторе. Спасибо за ответы!

Comments

    Ничего не найдено.