【问题标题】:Java client-server chat protocol designJava客户端-服务器聊天协议设计
【发布时间】:2014-01-26 16:53:50
【问题描述】:

我需要为 Java 上的客户端-服务器聊天创建一个协议。 我使用 xml 对它们之间的消息进行编码,但我无法决定如何将解码后的数据返回给服务器。

第一次,我创建了许多对象implements IAction(例如Auth 对象代表一个数据包,关于聊天中的新用户),这取决于它们的内容。 因此,当服务器接收到一个套接字时,它会调用我的public IAction decode(String s),然后,服务器应该确定它是什么对象:

if (myIAction instanceof Auth) {
   server.doMagicAuth((Auth) myIAction);
}

但它看起来很难看,因为类型转换和许多 ifes

另一种方法是创建一个名为Packet 的通用对象,它可以包含intValuefloatValuestringValue 等。它还有一个标志,说明它是什么类型的数据包。 但这是碰撞中最糟糕的想法。例如,如何向这个数据包发送 2 个 int 值?例如密码和users_id?

最新的想法是观察服务器。 服务器应该有许多重载的public void action(IAction a) 方法(action(Auth a) ... 等),并且协议应该根据数据包的类型通知服务器。

我无法决定使用什么方法。也许你有一些完全不同的想法?

【问题讨论】:

    标签: java client-server


    【解决方案1】:

    聊天客户端-服务器应用程序通常不发送/接收 2 个整数或 3 个浮点数或类似的东西,而只是字符串。 这些天来,我可能要么发送序列化为字符串的 JSON 对象,要么只是发送纯字符串。

    如果使用 XML 是一个严格的要求,您需要定义一些 XML 格式
    (可能通过一些 XSD,即使在您的情况下这不是强制性的)
    并坚持这种格式。示例:

    <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <message text="Hello"/>
    

    当它从任何客户端发送时,您在服务器端接收它,
    获取text 值并将其从服务器发送到所有连接的客户端。
    我相信这就是他们想要的一切。

    【讨论】:

    • XML 是我实验室的一个限制 =( 另一个问题是:如何将解码后的数据从协议传递到服务器
    • 解码后的数据只不过是一个字符串。只需以您喜欢的任何方式将其发送到您的服务器。调用方法、发送事件,几乎任何事情都可以在这里工作。
    • 再一次,我不问如何在数据包中表示我的数据)这是协议的工作。我无法决定如何将解码后的数据呈现给服务器。例如Protocol 解码一个 xml 字符串并理解它是一个数据包,带有从 user123user21 的新消息,所以我需要让服务器向 user21 发送消息。还有一个问题“如何要求服务器做到这一点?”其实是我想知道的)
    • 好吧,如果您的消息已经解码并包含senderreceivermessage,只需将其发布到某个队列。服务器读取该队列(例如每 N 秒)并将这些消息发送出去。然后用具有这 3 个字段的类来表示它。
    • 是的,如果你想通过使用一些设计模式来展示这些知识:)。您可以使用它,听起来适用于此。
    猜你喜欢
    • 2016-04-09
    • 2017-07-06
    • 2016-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-04
    • 2015-06-27
    相关资源
    最近更新 更多