java客户机/服务器应用程序

kqlmhetl  于 2021-07-09  发布在  Java
关注(0)|答案(3)|浏览(271)

我有一个多线程服务器,等待套接字连接。
第一次消息交换的类型总是相同的,客户端发送一个包含身份验证详细信息(userid/pwd)的对象,服务器检查该对象,并在身份验证是否通过时回复服务器。
在第一次交换消息之后,客户机将发送一些请求,与服务器能够执行的各种任务相对应。我该如何为这些不确定的请求建模?特别是我的问题是关于在客户机和服务器之间使用inputObjectStream/outputobjectstream发送的对象的类型
我有两个想法:
使用“generic message”对象,具有两个属性:任务标识符和不带泛型的hashmap,能够携带执行任务所请求的各种类型的参数。
对于每种类型的任务都有一个对象,这个解决方案是“更干净”的,但是我不知道如何让服务器了解接收到的消息的类型,我考虑了一系列的对象强制转换,将从客户端接收到的消息转换为每一个可能的“特定任务消息”,忽略了许多castexception。听起来很糟糕,有什么办法可以避免吗?

wecizke3

wecizke31#

第一种方法非常通用,但很难维护。过了一会儿,您会注意到您不再记得在这个通用Map中应该是什么类型的对象。你得保持词典的同步。
第二种方法更好。基本上你会收到一份摘要 Request 具有各种子类的对象。基类可以保存一些常规信息。通常,您将使用多态性并在每个子类中实现操作,覆盖来自的抽象方法 Request 班级。但是不能,因为请求对象必须持有服务器端逻辑。
在这里你能做的最好的就是visitor设计模式。有了它,以稍微模糊代码为代价,您将得到非常通用和安全的设计。 instanceof 过了一段时间就难看了。

fykwrbwg

fykwrbwg2#

你能做的就是 XML 用于通信的消息。您可以在第一个字节中预先指定 XML 对象消息应该被Map,在接收到消息时,只需检查这些字节并找到指示符,然后使用剩余的bytesequence将字节封送到xml对象(使用 JAXB 或者 SimpleXML 或者 DOM 或者任何其他xml解析器)xml非常冗长,您可以在这里使用它来封装消息。

eh57zj3b

eh57zj3b3#

为什么不把这两个想法结合起来呢
从服务器可以强制转换的公共级别接口开始,以确定它应该做什么或现在要做出什么React。
当对象传递给负责处理te请求的处理程序时,te请求可以进一步强制转换对象(基于更深层的接口实现)
伊姆霍

相关问题