Использование странного формата для отправки dat через сокет

#java #sockets

#java #сокеты

Вопрос:

У меня есть приложение на Android, которое является своего рода клиент-сервером.

Я установил соединение между этими двумя и теперь отправляю данные через сокет.

Сервер — это тот, кто отправляет данные, а клиент считывает их из сокета.

Сервер отправляет в сокет некоторые данные GPS (долгота, широта), и для их реальной отправки я использую следующий формат:

общедоступный класс Coordinate {

   private final double lon;

  private final double lat;

  private final int workerId;

  public Coordinate(double lat, double lon, int workerId) {

    this.lat = lat;
    this.lon = lon;

    this.workerId=workerId;
  }

  public double getLon() {
    return lon;
  }

  public double getLat() {
    return lat;
  }
  public int getwId(){
      return workerId;
  }


}
  

Итак, для каждой долготы и широты, которые я хочу отправить, я добавляю workerId, который является int.

Итак, наконец, через мой сокет я отправляю экземпляр класса Coordinate.

    Coordinate coord=new Coordinate(lat,lon,workerID);
   os=new PrintStream(clientSocket.getOutputStream());

    os.println(coord);
  

Что ж, пока здесь все идет нормально.

На стороне клиента я считываю данные таким образом:

Scanner is=новый сканер (новый поток ввода данных(socket.getInputStream()));

 while(is.hasNext())
            {
                try{
                Coordinate coord=is.next();
                    System.out.println(coord.getLon());

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

Проблема в том, что класс Scanner, который я использую для чтения из входного потока сокета, возвращает строку, но то, что я отправляю через сокет, является чем-то совершенно другим……

Кто-нибудь знает, как я мог бы преобразовать входные данные в координаты или как мне следует определить широту и долготу по тому, что я отправляю через сокет?????

Спасибо!

РЕДАКТИРОВАТЬ: я использую этот формат, потому что у меня есть свои потребности в этих данных!!

Ответ №1:

os.println(coord) это просто написание ссылки, которая не имеет особого смысла, если вы хотите отправить что-то значимое, то Coordinate класс должен реализовать Serializable . Взгляните на эту статью, где это объясняется.

При необходимости я рекомендую вам выполнять дамп и загрузку на обоих концах, используя формат JSON. Это предоставит вам простой и понятный способ взаимодействия.

Комментарии:

1. Да, именно так я говорю «необязательно». С serializable вы получаете только связь Java2Java с JSON, вы могли бы обмениваться данными между многими другими платформами / языками. Больше похоже на подход, аналогичный RESTful. Если вас не очень волнует совместимость, и только ваш клиент будет получать доступ к сервису, тогда выбирайте Java Serializable.

2. На самом деле мой сервер на Java, а мой клиент на Android-Java …. он единственный, кто читает эти данные. Спасибо

Ответ №2:

PrintStream.println(Object) записывает строку, которую он получает из Object.toString() метода объекта ( PrintStream в общем случае записывает строки только в outputstream, к которому он подключен)

вы можете либо создать текстовую кодировку для Coordinate (с функциями encode и decode), которую вы можете использовать без особых изменений в своем коде

или используйте сериализуемую функциональность и используйте ObjectStreams