Использование странного формата для отправки данных через сокет - PullRequest
3 голосов
/ 20 мая 2011

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

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

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

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

public class 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, который является целым числом.

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

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

    os.println(coord);

Ну, пока здесь все идет хорошо.

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

Scanner is = new Scanner (new DataInputStream (socket.getInputStream ()));

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

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

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

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

Thx!

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

Ответы [ 2 ]

1 голос
/ 20 мая 2011

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

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

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

1 голос
/ 20 мая 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...