我有一个多线程服务器,等待套接字连接。
第一次消息交换始终是相同类型,客户端发送带有身份验证详细信息的对象(userid / pwd),服务器检查它并在验证通过之后回复服务器。
在第一次消息交换之后,客户端将发送一些请求,这些请求对应于服务器能够执行的各种任务。 我如何模拟这些异构请求?特别是我的问题是关于客户端和服务器之间使用InputObjecStream / OutputObjectStream发送的对象类型
我有两个想法:
使用“通用消息”对象,具有2个属性:任务标识符和没有泛型的HashMap,能够携带执行任务所请求的各种类型的参数。
一个对象为每种类型的任务,这个解决方案是“更干净”,但我不知道如何让服务器理解收到的消息的类型,我想到了一系列的对象转换从客户端收到消息到每个可能的“特定任务消息”,忽略了许多CastException。这听起来很糟糕,有什么方法可以避免这种情况吗?
答案 0 :(得分:2)
为什么不结合这两个想法
从服务器可以投射的公共级别界面开始,以确定它应该做什么或现在做出反应。
当对象被传递给负责处理te的处理程序时,可以进一步转换对象(基于更深层次的接口实现)
IMHO
答案 1 :(得分:1)
第一种方法非常通用,但很难维护。过了一会儿,您会注意到您不再记得此通用地图中应包含的对象类型。您必须保持字典同步。
第二种方法要好得多。基本上,您会收到一个带有各种子类的抽象Request
对象。基类可以包含一些常规信息。通常,您将使用多态并在每个子类中实现操作,从而覆盖Request
类中的抽象方法。但是你不能,因为请求对象必须保持服务器端逻辑。
您可以在此处做的最好的事情是visitor design pattern。有了它,以略微模糊代码的代价,您将获得非常通用和安全的设计。经过一段时间后instanceof
会变得丑陋。
答案 2 :(得分:0)
您可以使用XML
消息进行通信。您可以在第一个字节中添加一个指示,指示消息应该映射到哪个XML
对象以及接收消息时,只需检查这些字节找到指示符,然后使用其余的bytesequence将字节封送到XML对象(使用JAXB
或SimpleXML
或DOM
或任何其他xml解析器)XML非常详细,您可以在此处使用它来封装您的消息。