`

SIP IM设计思路

    博客分类:
  • SIP
阅读更多
1。启动客户端界面程序InstantMessagingGUI,通过配置文件初始化SIP协议栈,界面以及好友列表;
2。初始化IM消息监听器ListenerInstantMessaging和用户代理IMUserAgent,ListenerInstantMessaging负责界面事件的处理,IMUserAgent实现接口SipListener;
3。IMUserAgent初始化IMAckProcessing,IMRegisterProcessing,IMByeProcessing,IMSubscribeProcessing,IMNotifyProcessing,IMInfoProcessing,IMMessageProcessing,IMPublishProcessing以及PresenceManager
用户代理IMUserAgent调用SipFactory来创建HeaderFactory,AddressFactory,
MessageFactory,SipStack;
4。SipStack创建ListeningPoint和SipProvider;
5。当点击注册按钮时,调用ListenerInstantMessaging的signMenuMouseClicked(MouseEvent mouseEvent)方法,该方法调用IMRegisterProcessing和IMPublishProcessing来进行处理登陆,imRegisterProcessing.signIn(localSipURL.trim())负责处理登陆,imRegisterProcessing.signOut(localSipURL.trim())负责处理离线退出。主要实现方法如下:
Request request=messageFactory.createRequest(requestURI,"REGISTER",
callIdHeader,cseqHeader,fromHeader,toHeader,viaList,maxForwardsHeader);
ClientTransaction clientTransaction=sipProvider.getNewClientTransaction(request);
clientTransaction.sendRequest();
如果用户选择离线,则imPublishProcessing.sendPublish(localSipURL.trim(),"offline")来发布离线消息。
6。IMUserAgent的方法processRequest(RequestEvent requestEvent)处理所有要发送的请求,主要实现如下:
if (request.getMethod().equals(Request.ACK)) {
                imAckProcessing.processAck(requestCloned, serverTransaction);
            }
            else if (request.getMethod().equals(Request.BYE)) {
                imByeProcessing.processBye(requestCloned,serverTransaction);
            }
            else if (request.getMethod().equals("MESSAGE")) {
                imMessageProcessing.processMessage(requestCloned,
serverTransaction);
            }
            else if (request.getMethod().equals("INFO")) {
                imInfoProcessing.processInfo(requestCloned,serverTransaction);
            }
            else if (request.getMethod().equals("SUBSCRIBE")) {
imSubscribeProcessing.processSubscribe
    (requestCloned,serverTransaction);
            }
            else if (request.getMethod().equals("NOTIFY")) {
                imNotifyProcessing.processNotify(requestCloned,serverTransaction);
            }
方法processResponse(ResponseEvent responseEvent)处理所有收到的响应,主要实现如下:
if ( response.getStatusCode()==Response.OK ||
                   response.getStatusCode()==202 ){
                     if (cseqHeader.getMethod().equals("REGISTER") ) {
                         imRegisterProcessing.processOK(responseCloned,clientTransaction);
                     }
                     if (cseqHeader.getMethod().equals("MESSAGE") ) {
                         imMessageProcessing.processOK(responseCloned,clientTransaction);
                     }
                     if (cseqHeader.getMethod().equals("BYE") ) {
                         imByeProcessing.processOK(responseCloned,clientTransaction);
                     }
                     if (cseqHeader.getMethod().equals("SUBSCRIBE") ) {
                         imSubscribeProcessing.processOK(responseCloned,clientTransaction);
                     }
     //Henrik Leion added NOTIFY processing
     if (cseqHeader.getMethod().equals("NOTIFY") ) {
                         imNotifyProcessing.processOk(responseCloned,clientTransaction);
     }
7。当用户注册登陆成功后,调用方法imRegisterProcessing.processOK(responseCloned,clientTransaction)来更新。更新界面显示,更新状态并且通知好友,订阅所有好友的状态,通知订阅的好友,重新打开正在进行的所有Chat sessions。好友的状态由PresenceManager来进行管理。
8。当用户状态改变时,通过如下方法:
IMNotifyProcessing imNotifyProcessing=imUA.getIMNotifyProcessing();
            imNotifyProcessing.sendNotifyToAllSubscribers("open",localStatus);
来通知订阅者
9。当要进行聊天时,实例化RemoteSipURLFrame,在RemoteSipURLFrame里输入要聊天的对方URL,点确定后,产生ChatSessionManager来对会话进行管理。ChatSession负责会话,ChatFrame是会话框,按发送按钮时,会调用ChatSession的方法chatSession.sendIMActionPerformed(ActionEvent evt);来发送消息,然后sendIMActionPerformed(ActionEvent evt)方法会调用IMMessageProcessing的imMessageProcessing.sendMessage(localSipURL,remoteSipURL,text,this);来发送消息。发送的时候,IMUserAgent的processRequest会调用IMMessageProcessing的processMessage(Request request,ServerTransaction serverTransaction)对远端发送的请求进行处理,processResponse方法会调用IMMessageProcessing的processOK(Response responseCloned,ClientTransaction clientTransaction)来对远端的响应进行处理。远端的消息请求处理完毕后,会更新本地ChatFrame的内容并且发送ok回响给对方。客户收到ok回响后,表示对方已经收到,那么就把本地type的消息内容删除,更新ChatFrame的内容
分享到:
评论

相关推荐

    Cadence系统级封装设计 Allegro Sip APD设计指南

    《Cadence系统级封装设计 Allegro Sip APD设计指南》是针对电子设计自动化(EDA)领域的专业文献,主要聚焦于使用Cadence公司的Allegro软件进行系统级封装(System-in-Package,SiP)的设计流程和技术。SiP技术允许...

    SIP 芯片封装 设计

    ### SIP芯片封装设计知识点 #### 一、SIP(System in Package)技术概述 SIP是一种先进的封装技术,它能够将多个不同的芯片或组件集成在一个封装内,形成一个多功能的系统级封装产品。这种技术主要应用于移动通信、...

    sip服务器概要设计

    **SIP 服务器概要设计** 本文档详细阐述了《企业即时通讯系统》中的SipServer的概要设计,旨在为开发团队提供清晰的指导,确保SipServer满足项目需求和性能目标。SipServer是即时通讯系统的核心组件,负责处理SIP...

    《芯片SIP封装与工程设计》章节例子20201017.rar

    《芯片SIP封装与工程设计》是一本深入探讨系统级封装(System-in-Package, SIP)技术的专业书籍,尤其在2020年10月17日的这个章节例子中,作者为我们揭示了SIP封装在现代集成电路设计中的重要性及其实现方法。SIP...

    SIP封装工艺及流程设计.pdf

    system in a package(SIP)需要设计SIP封装的同学可以拿走借鉴

    SIP设计,芯片封装设计,sysyem in package 不可多得的好资料,需要的同学赶紧下载吧

    ### SIP设计概述与关键技术 #### 一、SIP设计概览 SIP(System in Package)设计是指将多个不同功能的集成电路(ICs)及无源元件整合到一个封装内的技术,这种高度集成的设计方法能够有效减少系统的体积,提高整体...

    基于JAIN SIP的sip实现技术

    SIP的设计理念遵循互联网一贯的原则——简洁、开放、兼容以及可扩展。相较于H.323,SIP在复杂度、可扩展性、资源利用与管理、多服务支持、互操作性以及无线领域应用等方面表现更优。 实现SIP协议的方式多种多样,...

    sofia-sip-1.12.5.tar.gz_Presence_SOFIA_simple SIP r_sip_sip 协议栈

    SIMPLE(SIP for Instant Messaging and Presence Leveraging Extensions)是SIP的一个子集,专为即时消息(IM)和Presence功能设计。它将SIP协议扩展到支持文本聊天、文件传输以及状态信息的交换。通过SIMPLE,...

    SIP与诺基亚SIP工具

    SIP作为一种基于文本的协议,其设计初衷是为了在用户之间发起交互式的多媒体会话,包括但不限于音频、视频等。随着时间的发展,SIP的应用范围不断拓展,涵盖了在线显示、即时消息(IM)等多种场景。SIP的灵活性使得它...

    IC SIP 封装 设计 电磁仿真 热仿真 结构仿真

    ### IC SIP封装设计及其仿真技术详解 #### 一、IC封装设计概述 IC封装设计是集成电路制造中的一个重要环节,它不仅决定了芯片的功能实现方式,还直接影响到芯片在实际应用中的性能表现。随着电子产品向高性能、高...

    Sip注册 Java实现

    2. **创建SIP会话**:通过SIP堆栈创建`javax.sip.SipContext`对象,它代表了SIP会话。会话中包含了用户的认证信息和通信设置。 3. **创建SIP URI**:使用`javax.sip.address.SipURI`表示用户身份。通常格式为`sip:...

    免费WINDOWS 下的SIP 服务器软件 miniSipServer

    迷你SIP服务器(miniSipServer)是一款专为Windows操作系统设计的免费SIP服务器软件,主要功能是提供语音-over-IP(VoIP)服务。在本文中,我们将深入探讨SIP协议、miniSipServer的特点及其在实际应用中的重要性。 ...

    SIP.js-master_sip.js介绍vsjssip_sip.js_SIP.js-master_

    两者都是为Web浏览器设计的SIP库,但可能存在性能、API设计、文档质量、社区支持等方面的差异。选择其中一个通常取决于具体项目的需求,例如,开发者可能更倾向于具有更好文档或更活跃社区的库。 在压缩包文件名称...

    sip.rar_C# SIP_SIP C++_SIP 源码_sip_sip源码

    在IT行业中,SIP(Session Initiation Protocol)是一种用于控制多媒体通信会话(如语音和视频通话)的信令协议。这个"sip.rar"压缩包文件包含与C#和C++相关的SIP实现以及源码,是深入学习和理解SIP协议的好资源。...

    Sip揭秘.pdf

    深入解释了当今人们谈论最多的关于SIP协议是什么以及起草它的标准的原因,评价了SIP究竟能够做什么以及传递什么,评估了SIP同其他标准和系统的兼容度,设计了新的支持SIP的业务。SIP是能够在3G系统中传输IP多媒体...

    SIP模拟工具 SIP Inspector

    SIP Inspector 是一个用来模拟不同的SIP消息和通讯情景的工具,可用来创建 SIP 信令、定制 SIP 消息以及兼容输入和输出的消息包,该工具还可以直接从 pcap 文件中播放 RTP 流。

    how_to_write_sip.rar_SIP 代码_sip_设计文档

    这个"how_to_write_sip.rar"压缩包包含了一份关于如何编写SIP代码以及相关的设计文档,旨在帮助读者理解SIP协议的工作原理,并提供实际编码的指导。 在设计文档中,你可以期待找到以下关键知识点: 1. **SIP协议...

    VoIP系统及其SIP协议设计

    SIP协议遵循客户端-服务器模型,由用户代理(UA)发送请求到SIP服务器,服务器负责处理请求并转发响应,最终建立、修改或结束通信会话。 SIP协议的主要组件包括: 1. 用户代理(UA):分为用户代理客户端(UAC)和...

Global site tag (gtag.js) - Google Analytics