Использование функции 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 ... как будто он не принимает какой-либо входной поток от камеры. Я знаю, что могу продолжать играть с ним, но любой совет извне ценится.
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