Использование Winsock «отправить» в Java - PullRequest
2 голосов
/ 17 августа 2010

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

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

char* cmd = "#TRGON\x0d";
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 весь день и не смог заставить камеру делать что-либо, кроме как подключиться к соответствующему адресу (есть команда для включения светодиодов).

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

Большое спасибо за любую помощь.1016 * Я не знаю, поможет ли какой-нибудь код!На данный момент я просто делаю простые вещи: подключаюсь и пытаюсь писать в него.Кажется, я попробовал каждую комбинацию, преобразование и т. Д. Это всего лишь некоторый тестовый код (очевидно, не надежный или неправильный, как блок 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();
}

Он висит на последней строке, в= новый ... как будто он не принимает любой тип входного потока с камеры.Я знаю, что могу продолжать играть с этим, но любой внешний совет приветствуется.

Ответы [ 3 ]

3 голосов
/ 18 августа 2010

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

Socket s = new Socket("hostname", port);
OutputStream os = s.getOutputStream();
os.write("#TRGON\r".getBytes());
os.flush();

Так в чем конкретно ваши проблемы? Конечно, если соединение выглядит символьным, вы не должны использовать DataOutputStream, а вместо этого записывать в него простые ASCII-строки.

[редактировать: заменено \x0d на \r]

2 голосов
/ 18 августа 2010

Похоже, вы 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();

Полагаю, это настолько сыро, насколько это возможно.

1 голос
/ 18 августа 2010

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

"#TRGON\x0d"

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

"#TRGON\r"

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

...