Java客户端/服务器应用程序

3

我有一个多线程服务器,等待socket连接。

第一次消息交换总是相同类型的,客户端发送带有身份验证细节(用户ID /密码)的对象,服务器检查并回复服务器是否已通过身份验证。

完成这个第一个消息交换后,客户端将发送一些请求,对应于服务器能够执行的各种任务。如何建模这些不同的请求?特别是,我的问题涉及到在InputObjectStream / OutputObjectStream之间传输的对象类型。

我有两个想法:

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

  2. 每种任务都有一个对象,这个解决方案更加“干净”,但我不知道如何使服务器理解接收到的消息类型,我考虑从客户端接收到的消息进行一系列对象强制转换为每个可能的“特定任务消息”,忽略许多CastException。这听起来很糟糕,有没有避免这种情况的方法?


如果您选择路径2,请使用instanceof - obataku
3个回答

2

为什么不将这两个想法结合起来呢?

从一个通用的级别接口开始,服务器可以进行转换以确定它应该做什么或如何反应。

当对象被传递给负责处理请求的处理程序时,可以根据更深层次的接口实现进一步转换对象。

在我看来。


不错的想法,我真的很喜欢它:它听起来比访问者模式更简单,只需要一个额外的接口而不是两个(元素和访问者)。我将会阅读更多关于访问者设计模式的内容,但我认为我会使用这个解决方案。 - alessiop86

1

第一种方法非常通用,但很难维护。过一段时间,您会发现您不再记得这个通用映射中应该有什么类型的对象。您将不得不保持字典同步。

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

在这里,您最好能够采用 设计模式。通过稍微模糊您的代码,您将获得非常通用和安全的设计。在一段时间后,instanceof往往会很丑陋。


我刚刚读到了关于访问者模式的内容,以前从未使用过。在你的设计中,访问者应该是处理消息并执行任务的方法,而被访问元素则是消息? - alessiop86
@mark:是的,抽象的“Request”类有“accept(visitor)”方法,具体的访问者根据实际的“Request”类型实现不同的处理程序方法。无需子类化和“instanceof”。 - Tomasz Nurkiewicz
由于我只需要一个具有许多重载visit()方法的具体访问者,所以我应该避免使用访问者接口并直接使用具体访问者吗?这对我来说似乎是无用的。 - alessiop86
@mark:是的,拥有“Visitor”接口和具体实现没有意义。你可以在需要时进行拆分。 - Tomasz Nurkiewicz

0
你可以使用 XML 消息来进行通信。你可以在前面的几个字节中加上一个指示器,以表示消息应该映射到哪个 XML 对象上。接收消息时,只需检查这些字节中的指示器,并使用其余的字节序列将字节编组为 XML 对象(使用 JAXBSimpleXMLDOM 或其他任何 xml 解析器)。XML 的语言非常冗长,但在这里可以用它来封装你的消息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接