Стандарт связи между сервером и клиентом
У меня есть вопросы относительно того, как сервер и клиент определяют стандарт связи между ними. Для справки я использую Java и приведенный здесь код.
- Клиенту необходим IP-адрес сервера для подключения к нему. Если сервер использует метод
InetAddress.getLocalHost().getHostAddress()
, возвращаемый IP-адрес будет локальным: полезно, если клиент находится на том же компьютере, что и сервер, в противном случае - меньше. Как я могу получить IP-адрес сервера, который нужен клиенту? Можно ли получить эту информацию без использования внешних служб или сайтов, которые проверяют ваш сервер и возвращают ваш публичный IP-адрес? - Предположим, я, клиент, установил
Socket
связь с сервером. Теперь мне нужно открыть поток ввода и вывода, который должен быть совместим с потоком на стороне сервера. Как я могу заранее узнать правильный вид? В качестве примера давайте рассмотрим случай с http://time.nist.gov/, порт 13. Я ожидаю, что вывод сообщения на этот сервер будетString
инкапсулирует текущую дату. Передает ли сервер сказанноеString
черезObjectOutputStream
, или, может быть,OutputStreamWriter
? Как я могу знать?
1 ответ
Клиенту нужен IP-адрес сервера для подключения к нему... Как я могу получить IP-адрес сервера, который нужен клиенту? Можно ли получить эту информацию без использования внешних служб или сайтов, которые проверяют ваш сервер и возвращают ваш публичный IP-адрес?
Клиент должен знать либо IP-адрес, либо имя хоста сервера. Если имя хоста известно, IP-адрес можно определить на стороне клиента, используяInetAddress.getByName( "java.sun.com" )
на примере java.sun.com.
Мне нужно открыть поток ввода и вывода, который должен быть совместим с потоком на стороне сервера. Как я могу заранее узнать правильный вид?
Поскольку обмен сообщениями варьируется от протокола к протоколу, клиент должен знать, что сервер поддерживает, и соответственно записывать потоки ввода и вывода. Обычно системы клиент-сервер обмениваются данными на основе байтов ввода и вывода. То есть между клиентом и сервером будет происходить обмен данными в виде простых байтов. Затем они конвертируют эти байты из / в символы, где это необходимо, на основе согласованной кодировки символов, например UTF-8.
Передает ли сервер указанную строку через ObjectOutputStream или, возможно, через OutputStreamWriter?
Здесь необходимо понимание идеи протокола. Возможно, вы уже знаете, что я пишу это просто для ясного объяснения. Протокол - это соглашение или контракт о стиле обмена сообщениями - сколько байтов нужно отправить, когда отправлять, как кодировать и т. Д. Например, в SMTP клиент должен сначала сказать HELO или EHLO, после получения которых сервер возвращает конкретный ответ. Клиент должен знать, чего ожидать на этом этапе и как двигаться дальше на основе протокола.
Использование ObjectInputStream
а также ObjectOutputStream
Сейчас, ObjectInputStream
а также ObjectOutputStream
это специфичная для Java оболочка над потоками ввода-вывода для чтения и записи байтовых буферов в "форме" объектов Java. То есть эти классы служат только целям, связанным с конкретными объектами Java. Это нормально, если известно, что сервер обменивается данными с помощью сериализованных / десериализованных объектов Java. Однако сервер, к которому подключается клиент, может вообще не использовать Java! Или даже если это так, он может общаться чистыми символами или байтами, а не объектами Java.
Я не уверен, какой протокол используется time.nist.gov:13. Вам нужно будет это понять и соответствующим образом закодировать своего клиента. Однако, поскольку вы упомянули, что он возвращает строку:
- Просто используйте
socket.getInputStream()
на клиенте, не оборачивая егоObjectInputStream
- Прочтите байты из этого потока до EOF
- Преобразуйте эти байты в
String
с учетом кодировки символов, опубликованной на сайте, скажем, UTF-8.new String( bytes, StandardCharsets.UTF_8 )
.