Сеть между клиентом Java Socket и сервером C ++ (на основе Boost) - PullRequest
2 голосов
/ 11 августа 2011

На работе я разрабатываю пользовательский интерфейс для управления группами роботов.Роботы используют широковещательные передачи UDP для управления своими движениями друг с другом.

Графический интерфейс должен иметь возможность общаться с роботами.Для этого запускается промежуточный сервер.Все роботы слушают его (с датчиками UDP), и все работающие графические интерфейсы подключаются к нему (через TCP).Он управляет связью через графический интерфейс <-> Robot.

Однако сервер написан с помощью библиотеки C ++ Boost, а графический интерфейс написан на Java, и возникают некоторые проблемы с сетью.Я легко подключаюсь к серверу с помощью сокета:

try {
    socket = new Socket(targetAddress, targetPort);
} catch (IOException e) { e.printStackTrace(); }

Сервер регистрирует соединение, и все выглядит хорошо.

Однако, когда я пытаюсь отправить строки:

try {
    stream.writeUTF(message);
    stream.flush();
} catch (IOException e) { e.printStackTrace(); }

Примечание. Сначала я использовал PrintWriter для отправки строк по одной (println ()), но переключился на DataOutputStream, чтобы посмотреть, поможет ли это.

Мы столкнулись спроблемы.Boost даже не регистрирует, что я отправил сообщение, хотя Java успешно это сделала.Кроме того, когда строки отправляются с сервера, они находятся в неузнаваемом формате.

Небольшое изучение проблемы предполагает, что Boost автоматически добавляет текст «заголовка» ко всем отправляемым сообщениям, помогая архивировать сообщения.он получает.Поскольку Java этого не делает, похоже, что это может быть причиной.Это правильно?Если так, как мы можем обойти это?


Несколько замечаний:

  • Из-за нехватки времени переключение на другие библиотеки / языки в больших масштабах на самом деле не оченьопция.Однако, если есть библиотека C ++ TCP, которая позволит серверу получать отправляемые мной сообщения, и мы можем легко интегрировать ее, это будет perfect .
  • Сетевой код Java работаетидеально при подключении к серверу Java.Кажется, что трудности возникают в интерфейсе Boost-Java.
  • К сожалению, ни я, ни другой человек, работающий над этим аспектом проекта, не имеют такого опыта работы в сети.:( Мой опыт в разработке Java и GUI, а другой человек - программист AI / специалист по аппаратному обеспечению. Любая и вся помощь в этом вопросе была бы невероятно желательна.

Ответы [ 2 ]

0 голосов
/ 11 августа 2011

Прежде всего вам необходимо знать, какую кодировку, порядок байтов и формат пакета использует Boost для определения начала и конца команды. Например, команда может быть похожа на WALK, но вы просто не будете отправлять строку WALK через соединение. Он может использовать разделитель, такой как \ n, поэтому вы должны отправить: WALK \ n Другое дело, чтобы узнать, какую кодировку он использует, вы можете использовать строковый метод myString.getBytes ("UTF-8"); отправить байт [] в UTF-8 по сети, используя выходной поток сокета.

0 голосов
/ 11 августа 2011

Начните с отправки и получения первых байтов, затем целых. Имейте в виду размер (например, 64-битные целые числа в C ++) и порядок следования байтов (сначала младший, а не самый старший). Как отметил Сэм Миллер, вам нужно будет создать собственный протокол, который будет определять, какие типы сообщений вы можете отправлять и как упорядочены их элементы.

Что, вероятно, происходит, так это то, что Boost сначала посылает длину строки. Читайте о проводном формате сообщений, отправленных с использованием библиотеки Boost, и о проводном формате, используемом DataOutputStream.

...