SIP IM设计思路

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的内容
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值