服务器和客户端之间的通信标准

Standard of communication between server and client

我对服务器和客户端定义它们之间通信标准的方式有疑问。作为参考,我使用 Java 并引用代码 here.

  1. 客户端需要服务器的 IP 才能连接到它。如果服务器使用 InetAddress.getLocalHost().getHostAddress() 方法,将 returned 的 IP 地址将是本地的:如果客户端与服务器位于同一台机器上,则有用,否则就没那么有用了。如何获取客户端需要的服务器IP?是否可以在不使用外部服务或站点 ping 您的服务器和 return 您的 public IP 的情况下获取此信息?
  2. 假设我,客户端,已经与服务器建立了Socket通信。现在我需要打开输入和输出流,它必须是一种与服务器端流兼容的类型。我怎样才能提前知道正确的种类?例如,让我们考虑 time.nist.gov,端口 13 的情况。我希望与此服务器的通信输出是封装当前日期的 String。服务器是通过 ObjectOutputStream 还是 OutputStreamWriter 传输所述 String?我怎么知道?

The client needs the server's IP to connect to it... How can I get the server IP that the client needs? Is it possible to acquire this information without using external services or sites that ping your server and return your public IP?

客户端必须知道服务器的 IP 地址或主机名。如果主机名已知,则可以在客户端使用InetAddress.getByName( "java.sun.com" )计算出IP地址,以java.sun.com为例。

I need to open the input and output stream, which must be of a kind compatible with the stream on the server side. How can I know in advance the correct kind?

由于消息传递因协议而异,客户端必须知道服务器支持什么并相应地编写其输入和输出流。通常,客户端-服务器系统以基于字节的输入和输出进行通信。也就是说,纯字节数据将在客户端和服务器之间交换。然后,他们根据商定的字符编码,如 UTF-8,在需要的地方转换这些字节 from/to 字符

Does the server transmit said String through an ObjectOutputStream, or maybe an OutputStreamWriter?

这里是协议概念需要理解的地方。您可能已经知道,但是,我写它只是为了解释清楚。协议是消息传递风格的协议或合同——发送多少字节、何时发送、如何编码等。例如,在 SMTP 中,客户端必须首先说 HELO 或 EHLO,服务器收到后 returns 一个具体的回应。 客户必须知道在此阶段会发生什么以及如何根据协议进一步

ObjectInputStreamObjectOutputStream

的用法

现在,ObjectInputStreamObjectOutputStream 是一个 Java 特定的 IO 流包装器,用于读取和写入 Java 的 "shape" 中的字节缓冲区对象。也就是说,这些 类 仅服务于 Java-object-specific 目的。 如果知道服务器正在使用 serialized/deserialized Java 对象进行通信,这很好。 但是,客户端正在连接的服务器可能没有使用 [=57= 】 根本!或者即使是,它也可能以纯字符或字节而不是 Java 对象进行通信。

我不确定 time.nist.gov:13 使用的是什么协议。您将需要了解这一点并相应地对您的客户进行编码。但是,由于您已经提到它 returns 一个字符串:

  1. 直接在客户端使用socket.getInputStream(),不用ObjectInputStream
  2. 包装
  3. 从此流中读取字节直到 EOF
  4. 考虑到网站发布的字符编码,例如 UTF-8,将这些字节转换为 Stringnew String( bytes, StandardCharsets.UTF_8 ).