自己设计/实现协议的技巧

5

我工作的地方需要一个能够实现以下功能的协议:

  • 用户登录/注销
  • 发送/接收指令
  • 发送/接收文件
  • 发送/接收音频流(可以使用RTP)
  • 发送/接收小型XML文件并使用加密技术来保护数据

这个协议将会在Java中实现。因此,我有一些问题,因为我从未实现过网络协议。

  1. 是否可以使用现有的协议来构建这个协议?
  2. 我可以使用什么工具来帮助我设计协议?进行“建模”
  3. 我能否独自完成所有这些工作?我有足够的时间来完成它。

我对Java和C++有相当不错的了解,但还没有涉及到sockets / networking编程。

谢谢

5个回答

4

看一下Google Protocol Buffers,它将生成紧凑的线路协议并自动生成Java消息类。在使用Java NIO ByteBuffer编写自己的消息编解码器之前,我希望我能听说过它。


+1,这是一个我以前从未听说过的非常有趣的项目。几年前,我自己使用字节缓冲区编写了完整的消息编解码器(有时相当烦人),如果我有类似这样的工具,我可以大大缩短开发时间(但它还有效!)。等我有些空闲时间时,一定会看看这个工具。只是很遗憾,在我的当前工作中(使用C#和WCF),我不太能用得上它。 - wasatz
3
请记住,虽然它的名字中有“协议”,但它实际上只是将消息序列化/反序列化为二进制格式的一种方式。这只是设计自己的消息交换的一个小步骤。您还需要考虑状态、错误恢复、处理潜在冲突/消息竞争等等。 - viraptor

2

我有一种感觉,你想要重新发明SIP(如果你的数据包处理大多是无状态的,并且XML足够小,可以放入小于3K的数据包),或者XMPP。

如果你需要基于连接的登录/注销和状态命令/指令,则XMPP可能更接近要求。此外,已经存在针对XMPP的Jingle扩展来处理RTP设置和拆除。将XML消息嵌入到自定义XMPP数据包(它们本身就是XML)中非常简单,而且已知的XMPP解决方案可用于代理文件传输。

我非常确定它可以很好地满足你的需求(至少是在这里提出的方式)。如果你不需要设计全新的协议,那么最好不要这样做。并且重复使用现有的XMPP服务器将允许你解决创建自己的消息代理的痛苦。有一个用Java编写的OpenFire服务器。


我了解到Smack可能用于创建我的客户端,而我应该使用openfire作为服务器。但是我不知道Smack是否支持流式传输,我尝试谷歌搜索,但没有成功。这应该是最好的方法吗? - fredcrs
我是说音频流,抱歉。 - fredcrs

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

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

例如,如果TAG ==“LOGIN”,则CONTENT可能是登录详细信息或类似信息。当TAG ==“MESSAGE”时,CONTENT可能是表示参数的JSON字符串,例如收件人是谁以及消息的内容等。

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

我通常还在两侧实现状态设计模式,但至少在服务器端。例如,服务器从WaitingForLogin状态开始。当客户端登录时,它会切换到仅侦听文件和聊天消息的不同状态。通过这种方式,我发现管理起来更容易一些。


感谢分享你的方法!这表明我走在了正确的方向上。 - Iqra.

0

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


http(s)在发送大文件/音频等方面效果很差。同时,它也是无状态的,因此构建登录功能会更加困难。 - Tom Gullen

0

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接