关于自己协议的设计/实现的提示

时间:2010-08-05 11:56:42

标签: java sockets networking protocols

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

的协议
  • 用户登录/注销
  • 发送/接收说明
  • 发送/接收文件
  • 发送/接收音频流(可以使用RTP)
  • 发送/接收小型XML文件使用
  • 加密所有这些。

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

  1. 是否可以使用现有协议构建此协议?
  2. 我可以用什么工具来帮助我设计协议?用于“建模”
  3. 是否有可能完成这一切,独自完成?我有足够的时间来做这件事。
  4. 我在Java和C ++方面有很好的背景,但还没有使用套接字/网络编程。

    由于

5 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

我有一种感觉,你正试图重新发明SIP(如果你的数据包处理主要是无状态的,而且XML足够小,可以进入< 3k数据包),或者XMPP。

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

我很确定它能很好地满足您的要求(至少它们在这里呈现的方式)。如果您不必设计一个全新的协议,那么如果您不这样做,可能会更容易。同时重用现有的XMPP服务器可以解决创建自己的消息代理的难题。有OpenFire服务器,用Java编写。

答案 2 :(得分:1)

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

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

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

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

我通常也会在两侧实现状态设计模式,但至少在服务器端实现。例如,服务器以WaitingForLogin状态启动。当客户端登录时,切换到仅侦听文件和聊天消息的其他状态作为示例。通过这种方式,我发现管理起来更容易一些。

答案 3 :(得分:0)

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

的实现

答案 4 :(得分:0)

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

如果你想编写自己的协议,首先要学习像JSON或类似的RPC形式,这将使你的生活更轻松。