【问题标题】:Tips about design/implementation of own protocol关于设计/实现自己的协议的提示
【发布时间】:2025-12-05 16:40:01
【问题描述】:

在我工作的地方,我们需要一个能够:

  • 用户登录/注销
  • 发送/接收指令
  • 发送/接收文件
  • 发送/接收音频流(可以使用 RTP)
  • 使用发送/接收小型 XML 文件
  • 所有这些的密码学。

它将在java中实现。所以我有一些问题,因为我还没有实现过网络协议。

  1. 是否可以使用现有协议来构建此协议?
  2. 我可以使用什么工具来帮助我设计协议?对于“建模”
  3. 是否有可能独自完成这一切?我有足够的时间来做这件事。

我在 Java 和 C++ 方面有很好的背景,但还没有套接字/网络编程。

谢谢

【问题讨论】:

    标签: java sockets networking protocols


    【解决方案1】:

    我不知道这是否是个坏建议,但我通常为我的网络应用程序做的是创建一个包含 TAG 字符串和 CONTENT 字符串的 Message 对象。 CONTENT 部分通常是 JSON 字符串,消息本身也作为 json 字符串发送到服务器或从服务器发送。

    服务器或客户端收到消息时,会将json解析为Message对象。然后,您可以检查消息的 TAG 部分,了解消息的 CONTENT 部分中包含什么类型的内容并决定如何处理。

    例如,如果 TAG=="LOGIN" 那么内容可能是登录详细信息或类似信息。当 TAG=="MESSAGE" 时,CONTENT 可能是一个 json 字符串,表示您的参数,例如,谁是收件人,消息的内容是什么等。

    然后您可以对字符串进行加密和解密。如果这是一种愚蠢的做法,请在评论中告诉我,以便我学习:)

    我通常也在双方都实现状态设计模式,但至少在服务器端。例如,服务器以 WaitingForLogin 状态启动。当客户端登录时,它会切换到一个不同的状态,例如只监听文件和聊天消息。通过这种方式,我发现它更容易管理。

    【讨论】:

    • 感谢您分享您的方法!它表明我的方向是正确的。
    【解决方案2】:

    从头开始编写协议可能需要大量工作。看看 XMPP。

    如果您想编写自己的协议,请先学习一种 RPC 形式,例如 JSON 或类似的,这将使您的生活变得更轻松。

    【讨论】:

      【解决方案3】:

      我感觉您正在尝试重新发明 SIP(​​如果您的数据包处理大部分是无状态的并且 XML 小到足以进入

      如果您需要面向连接的登录/注销,以及有状态的命令/指令,那么 XMPP 可能更接近要求。此外,Jingle extension 到 XMPP 已经处理 RTP 设置和拆卸。 XML 消息很容易嵌入到自定义 XMPP 数据包(它们本身就是 XML)中,并且有用于代理文件传输的已知 XMPP 解决方案。

      我很确定它很好地满足了您的要求(至少在这里呈现的方式)。如果您不必设计一个全新的协议,那么您可能会更容易。此外,重用现有的 XMPP 服务器将使您能够解决创建自己的消息代理的痛苦。有 OpenFire 服务器,它是用 Java 编写的。

      【讨论】:

      • 我读到过,看起来 Smack 可以用来制作我的客户端......而且我应该使用 openfire 作为服务器。但我不知道 Smack 是否支持流媒体,我用谷歌搜索它没有成功。这应该是最好的方法吗?
      • 对不起,我不是说音频流。
      【解决方案4】:

      看看Google Protocol Buffers,它将生成一个紧凑的有线协议以及自动生成 Java 消息类。我希望我在使用 Java NIO ByteBuffers 推出自己的消息编解码器之前听说过它。

      【讨论】:

      • +1,这是一个我以前从未听说过的非常有趣的项目。几年前,我还推出了一个带有字节缓冲区的完整自己的消息编解码器(有时很烦人),如果我有这样的东西,我可以显着缩短开发时间(但是,嘿,它奏效了!)。当我有空的时候,我一定会看看这个。太糟糕了,在我目前的工作(C# 和 WCF ......)中我不会有太多用处。
      • 请记住,即使名称中有“协议”,它实际上只是将消息(反)序列化为二进制格式的一种方式。这只是设计您自己的消息交换的一小步。您需要考虑状态、错误恢复、处理潜在的冲突/消息竞争等。
      【解决方案5】:

      您可以使用 http 或 https。 java 媒体框架包含 rtp 的实现。

      【讨论】:

      • http(s) 在发送大文件/音频等方面非常糟糕。它也是无状态的,因此构建登录内容会更加困难。
      最近更新 更多