3

我有一个多线程服务器,正在等待套接字连接。

第一次交换消息的类型总是相同的,客户端发送一个带有身份验证详细信息(userid/pwd)的对象,服务器对其进行检查并在身份验证是否通过时回复服务器。

在第一次消息交换之后,客户端将发送一些请求,对应于服务器能够执行的各种任务。我如何为这些异类请求建模?特别是我的问题是关于使用 InputObjecStream/OutputObjectStream 在客户端和服务器之间发送的对象类型

我有两个想法:

  1. 使用“通用消息”对象,具有 2 个属性:任务标识符和没有泛型的 HashMap,能够携带执行任务所需的各种类型的参数。

  2. 每种类型的任务都有一个对象,这个解决方案“更干净”,但是我不知道如何让服务器了解接收到的消息的类型,我想到了从客户端接收到的消息的一系列对象转换到每个可能的“特定任务消息”,忽略许多 CastException。这听起来很糟糕,有什么办法可以避免这种情况吗?

4

3 回答 3

2

为什么不把这两个想法结合起来

从服务器可以转换的通用级别接口开始,以确定它应该做什么或现在做出反应。

随着对象被传递给负责处理请求的处理程序,可以进一步转换对象(基于更深层次的接口实现)

恕我直言

于 2012-08-25T08:53:13.903 回答
1

第一种方法非常通用,但很难维护。一段时间后,您会注意到您不再记得该通用地图中应该包含哪种对象。您必须保持字典同步。

第二种方法要好得多。本质上,您会收到一个Request带有各种子类的抽象对象。基类可以保存一些一般信息。通常你会使用多态性并在每个子类中实现动作,覆盖类中的抽象方法Request。但是你不能因为请求对象必须持有服务器端逻辑。

您可以在这里做的最好的事情是 设计模式。有了它,以稍微模糊代码的代价,您将获得非常通用和安全的设计。instanceof一段时间后往往会变得丑陋。

于 2012-08-25T08:54:13.177 回答
0

您可以做的是使用XML消息进行通信。您可以在第一个字节中预先指示XML消息应该映射到哪个对象,并在接收到消息时,只需检查这些字节找到指示符,然后使用其余字节序列将字节编组到 XML 对象(使用JAXBSimpleXMLDOM或任何其他xml 解析器)XML 非常冗长,您可以在此处使用它来封装您的消息。

于 2012-08-25T09:08:49.867 回答