我想实现一个在SIP上工作的即时消息传递框架。我有SIP客户端和一个元素,它将从客户端获取所有消息,并处理它们并将它们转发给其他SIP客户端。
客户端和管理元素将拥有自己的私有协议(彼此"交谈"),该协议将在SIP消息中(例如在有效负载中)传递。
我不知道的是我需要"管理元素"是什么。它应该是SIP客户机还是SIP服务器?我想的是,我将有一个SIP客户端,它将接收所有SIP消息,使用私有协议解析它们,并将其转发给其他客户端。因此,在管理系统的术语中,它将是一种"服务器",但在SIP术语中,它将是客户机。
我正在Java中实现这个"元素",但现在它真的不重要。我很乐意得到一些指导来帮助我。
对于您的问题,我将首先在两种模型之间进行选择:
1-您的IM客户端与IM服务器(或调度程序或"元素"或任何它被称为)建立会话(SIP对话框),并保持它的活动,只要他们正在运行,或登录。在这种情况下,SIP对话框总是在IM客户端和IM服务器之间建立,因此前者可以称为SIP客户端,后者可以称为SIP服务器。然后,IM消息在该对话框的两个方向上传递,使用中间对话框请求。如果您知道IM服务器可以从任何地方路由,那么这可能是一个好主意,但客户端可能在私有网络中。
2-更对称的方法是没有正在进行的对话。当任何一个实体,IM客户端或IM服务器,想要向另一个发送消息时,那么它只使用一次性的对话外SIP消息。在这种情况下,两端都需要实现SIP UA客户端和UA服务器功能。在任何情况下,当在IM客户端和服务器之间维护对话似乎是一个坏主意时,这可能是一个首选的解决方案,但路由不是问题。
当然,也有一个半途而废的解决方案,看起来像第二个,但不是每条消息都被单独发送,在对话框上下文中,可以建立一个临时对话框来发送消息(例如,避免重新验证每条消息),直到某个非活动计时器将对话框关闭。