代码之家  ›  专栏  ›  技术社区  ›  markovuksanovic

Java套接字-如何确定服务器端的数据类型?

  •  1
  • markovuksanovic  · 技术社区  · 14 年前

    我使用Java套接字作为客户端-服务器应用程序。有时客户端需要发送字节数组(使用BytErayOutPutsFipe),有时它应该发送自定义Java对象。如何从服务器端的输入流中读取信息并确定流中的内容,以便能够正确处理该信息?

    8 回复  |  直到 14 年前
        1
  •  1
  •   Erik Hermansen    14 年前

    首先将数据读入服务器上的字节数组。编写自己的解析例程,只需识别字节数组中的内容。

    第二步根据第一步的标识执行完整的对象解析。如果解析需要传递inputstream,则始终可以将步骤1中读取的字节数组放入新的bytearrayinputstream实例中。

        2
  •  2
  •   BalusC    14 年前

    通常,这是通过在包含主体信息的主体前面发送“header”来完成的。看看例如 HTTP protocol . http流存在一个通过双换行符与正文分隔的头。标题依次存在于 name: value 格式,每一个都由一个换行符分隔。在这种特殊情况下,在http中应该使用 Content-Type 用于标识正文数据类型的头。

    由于Java和TCP/IP不提供这方面的标准设备,所以您需要详细指定并记录您将通过该线路发送的格式,以便另一方知道如何处理流。当然,您也可以获取标准规范。例如http或ftp。

        3
  •  2
  •   corsiKa    14 年前

    处理这个问题有多种方法。

    一个是对象序列化,它通过Java对象(in out out)PutsFoad发送。但是,当知道何时从流中读取对象时,会遇到一个小问题。

    另一种方法是封送和解封xml。使用更多的流量,但更容易调试和运行。这有助于有一个文档良好的XML模式。这里的一个优点是可以使用现有的xml库。

    如果需要的话,可以尝试自定义格式,但最终可能只是一个草率、不太冗长的xml版本。

        4
  •  2
  •   Jack Edmonds    14 年前

    一般来说,我不相信Java中有一个特性允许你这样做。

    相反,可以考虑在每条消息中同时发送一些更多的信息来解释下一种类型。

    例如,您可以用整数对消息进行前缀,这样每当收到消息时,就读取前4个字节(整数为4字节)并解释其值(例如,1=字节数组,2=自定义Java对象,3=另一个自定义Java对象,……)。

    您还可以考虑添加一个包含消息大小的整数,以便知道当前消息何时结束,下一消息何时开始。

        5
  •  2
  •   nsayer    14 年前

    我会被要求对此进行过度杀戮,但是除非你真的需要这个协议是经济的,否则你可以考虑整理数据。我的意思是,如果不查看数据,你通常无法区分字节数组和其他数组的区别,因为你可以把所有东西都表示为字节数组。

    您可以很容易地使用jaxb来在xml之间进行数据整理。jaxb甚至可以将字节数组对象转换为十六进制字符串或base64。

        6
  •  1
  •   Adam Holmberg    14 年前

    您需要定义一个协议来指示遵循的数据类型。例如,可以用字符串或枚举值开始每次传输。服务器将首先读取此内容,然后根据“header”值读取以下数据。

        7
  •  0
  •   Mitch Dempsey    14 年前

    您可以做的是,用一个用于确定类型的整数来预处理您发送的任何数据。

    这样,您可以读取前4个字节,然后确定它是什么类型的数据。

        8
  •  0
  •   jaxvy    14 年前

    我认为最简单的方法是使用一个对象,该对象包含将与其类型信息一起发送的数据。然后,您可以发送此对象,并根据此对象的数据类型属性提取数据。