Java Client / Server应用程序

时间:2012-08-25 08:44:36

标签: java sockets client-server

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

第一次消息交换始终是相同类型,客户端发送带有身份验证详细信息的对象(userid / pwd),服务器检查它并在验证通过之后回复服务器。

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

我有两个想法:

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

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

3 个答案:

答案 0 :(得分:2)

为什么不结合这两个想法

从服务器可以投射的公共级别界面开始,以确定它应该做什么或现在做出反应。

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

IMHO

答案 1 :(得分:1)

第一种方法非常通用,但很难维护。过了一会儿,您会注意到您不再记得此通用地图中应包含的对象类型。您必须保持字典同步。

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

您可以在此处做的最好的事情是 design pattern。有了它,以略微模糊代码的代价,您将获得非常通用和安全的设计。经过一段时间后instanceof会变得丑陋。

答案 2 :(得分:0)

您可以使用XML消息进行通信。您可以在第一个字节中添加一个指示,指示消息应该映射到哪个XML对象以及接收消息时,只需检查这些字节找到指示符,然后使用其余的bytesequence将字节封送到XML对象(使用JAXBSimpleXMLDOM或任何其他xml解析器)XML非常详细,您可以在此处使用它来封装您的消息。