【问题标题】:How to send a "command" Object through Sockets to be excecuted on the server? Java如何通过套接字发送“命令”对象以在服务器上执行?爪哇
【发布时间】:2018-04-28 15:17:38
【问题描述】:

我正在开发一个聊天程序。

[JAVA] [没有 RMI,只有 Sockets] [命令示例:'sentToMike'、'Disconnect'、'Login' 等]

如何通过套接字发送“命令”对象以直接在服务器上执行? 我想向许多客户发送各种消息(字符串、音频、视频)和各种命令对象,其中任何一个。我知道存在 ObjectInput/Output 对象和所有这些。我的问题是试图获得一个多态的解决方案。

例如,我想创建一个带有方法签名“execute()”的 IMessage 接口。然后我会创建一个实现 IMessage 的 AudioMessage、TextMessage 等。问题是在某些时候我需要与客户端共享服务器代码,反之亦然,以便服务器和客户端知道每个执行方法中涉及的所有对象。最糟糕的是,如果我发送 IMessage,服务器将不知道该消息的具体类型,所以我不知道该对象的类型。当我将命令发送回客户端时也会发生同样的情况。

我可以使用简单的文本字符串“命令”和服务器中的一个大而丑陋的开关(顺便说一下在客户端)解决一个问题,但我认为这并不优雅,我需要创建一个包装类使用字符串命令加上我要发送的对象类型加上已发送对象类型的字符串(消息 [字符串类型;字符串命令;IMessage->AudioMessage ]),这不会是多态的,因为我需要使用例如,询问对象类型然后将其转换为 AudioMessage 的开关。此外,我需要在服务器和客户端之间共享大量代码,我不知道这是否可以。

非常欢迎任何建议,也许我需要一个设计模式,一个架构模式,我不知道。

【问题讨论】:

    标签: java sockets command polymorphism serversocket


    【解决方案1】:

    出于安全原因,不允许任何代码在服务器上运行!

    但是,如果您愿意将您的服务器(和客户端)暴露给未知代码,那么您还需要提供类字节码,并使用类加载器来启用您希望另一端接受的实例化类的类型。您的协议必须发送外来类(以及在父类加载器中找不到的所有依赖项)的完整类名和位置(如果不是内联字节码),以便希望调用此类对象的任何方法。

    (仅供参考,这只是重新发明 RMI)。

    如果你不需要在这个对象上调用任何东西(这不是你的情况,我知道,但我很想说),那么它是被动的,将它作为对象实例传输真的没有意义。

    【讨论】:

    • user2023577 感谢您的回复!那里很好。最后我只需要向服务器发送信息(文本音频视频),以及如何处理它对吗?那我该怎么做呢?
    • 嗯,你知道你的服务器能力。您提到的用于识别操作的字符串参数很好。给定一些动作参数和类型参数,您可以在函数名称的哈希图中搜索函数代码以定位服务器支持的动作。示例:“sendto-video”映射到 SendVideoAction,而“sendTo-text”映射到 SendTextAction。这些需要确定,但至少你保存了 if instanceof elseif instanceof... 的长级联
    • 现在我正在考虑创建一个类来解码发送的对象并将其转换为服务器/客户端内部的命令。发送的对象将是 Message[String 命令;信息文字/音频/视频;字符串类型的信息]。
    • 谢谢 user2023577 !这就是我要做的。感谢您澄清我的概念。我将您的回复标记为已接受。第一次这样做,所以我希望它被正确标记。
    猜你喜欢
    • 1970-01-01
    • 2015-01-26
    • 1970-01-01
    • 2018-06-17
    • 2011-07-29
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    相关资源
    最近更新 更多