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

时间:2020-01-30 12:01:03

标签: java stream ip client-server ip-protocol

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

  1. 客户端需要服务器的IP才能与其连接。如果服务器使用方法InetAddress.getLocalHost().getHostAddress(),则将返回的IP地址将是本地的:如果客户端与服务器位于同一台计算机上,则很有用,反之则不然。如何获得客户端所需的服务器IP?是否可以在不使用ping服务器并返回公共IP的外部服务或站点的情况下获取此信息?
  2. 假设我(客户端)与服务器建立了Socket通信。现在,我需要打开输入和输出流,该输入和输出流必须与服务器端的流兼容。我如何提前知道正确的种类?例如,让我们考虑端口13的time.nist.gov情况。我希望与此服务器的通信输出为String,其中封装了当前日期。服务器是通过String还是通过ObjectOutputStream传送说的OutputStreamWriter?我怎么知道?

1 个答案:

答案 0 :(得分:2)

客户端需要服务器的IP才能与其连接...如何获得客户端所需的服务器IP?是否可以在不使用ping服务器并返回公共IP的外部服务或站点的情况下获取此信息?

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

我需要打开输入和输出流,该输入和输出流必须与服务器端的流兼容。我如何提前知道正确的种类?

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

服务器是否通过ObjectOutputStream或OutputStreamWriter传输所述字符串?

这是需要了解协议概念的地方。您可能已经知道,但是,我正在写它只是为了清楚地说明。协议是消息传递样式的协议或合同-发送多少字节,何时发送,如何编码等。例如,在SMTP中,客户端必须首先说出HELO或EHLO,然后服务器才返回特定的消息。响应。 客户必须知道在此阶段会发生什么,以及如何根据协议进一步。

ObjectInputStreamObjectOutputStream的使用

现在,ObjectInputStreamObjectOutputStream是IO流上特定于Java的包装程序,用于以Java对象“形状”读取和写入字节缓冲区。也就是说,这些类仅用于特定于Java对象的目的。 如果知道服务器正在使用序列化/反序列化的Java对象进行通信,这很好。但是,客户端连接的服务器可能根本没有使用Java!或者即使是,它也可能以纯字符或字节而不是Java对象进行通信。

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

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