#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