`

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的内容
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics