在SipServlet中使用SipSession或SipApplicationSession来处理UA状态的改变
来源:互联网 发布:车英制螺纹编程实例 编辑:程序博客网 时间:2024/06/05 07:14
先说点与本文无关的,今天终于用X-Lite注册上,原来是需要设置呼出经过的proxy服务器为"127.0.0.1:5081",当然了,这是本机,如果是其他电脑,需要将IP设置为服务器.5081是SDS中P-CSCF所使用的端口,如果只使用IP地址,也是不可以的!
如果是一个B2BUA,那么只需要一个全局容器Hashmap<SipSession,SipSession> map,保存所有"存活"的session,但是现在我的是一个proxy servlet和一个B2BUA servlet,这样,保存状态的容器需要能被两个servlet class 共用.所以在分别在两个Servlet中创建ServletContext对象,并且分别在init函数中初始化ctx=config.getServletContext().如下:
然后在第一个Servlet--ProxyServlet中
在第二个Servlet--B2BUAServlet中
这样就解决了在两个Servlet中使用同一个Map保存session的问题.但是使用HashMap<SipSession,SipSession>这种数据结构合适吗?对于ProxyServlet来说,他只能得到一个SipSession--request.getSession(),使用List或许更合适...
但是还有问题,就是在查找或者删除的时候会出现大量代码,影响代码的可读性,于是决定将List<SipSession>的操作封装在一个类StateList中 想到一个问题...如果真的用SipSession来保存状态的话,List或者Map还真的需要吗?...似乎完全不需要了! 哈哈哈!~全写的是废话啊!只需要在收到182的时候将session置一个属性值(HELD),作为标记,在收到ACK的时候,判断ACK.getSession().getAttribut("Flag")是否等于HELD.如果是,那么proxy这个ACK请求,并且 SipApplicationSession sas = ACK.getApplicationSession(true); sas.setAttribute("INVITE_SEND","INVITE_SEND); SipServletRequest newReq = sf.createRequest(sas,"INVITE",ACK.getTo(),ACK.getFrom()); 在收到 200 OK 时加上判断 resp.getMethod() == "INVITE" && resp.getRequest().isInitial != true 如果"是" 拷贝此response的SDP信息 resp.setContentType("text/plain"); String content = resp.getContent(); 然后 SipApplicationSession sas = resp.getApplicationSession(true); 判断sas.getAttribute("INVITE_SEND")=="INVITE_SEND"; 如果是 SipServletRequest newReq = sf.createRequest(sas,"INVITE",resp.getFrom(),resp.getTo());
newReq.setContentType("text/plain");
newReq.setContent(content,"text/plain");
newReq.setContentType("sdp/application");
newReq.setContentLength(content.length());
newReq.send();
sas.removeAttribute("INVITE_SEND");
resp.createACK().send();
当然了,这些都是在ProxyServlet中完成的功能,明天,来写B2BUAServlet中的方法需要完成的功能
- 在SipServlet中使用SipSession或SipApplicationSession来处理UA状态的改变
- 使用WifiManager来改变网卡的状态
- Android 使用 selector 来改变TextView在不同状态下的textColor和background
- 如何在 Visual Basic 或 VBA 中使用 ADO 来处理 Excel 数据
- 如何在 Visual Basic 或 VBA 中使用 ADO 来处理 Excel 数据
- Android中使用selector动态改变imageView或ImageButton的背景和在GridView中应用
- Android中使用selector动态改变imageView或ImageButton的背景和在GridView中应用
- SharePoint 2013 中使用JSLink 来改变列表中某个字段或view(视图)的显示方式
- 在MB消息流中,如何使用ESQL来动态改变HTTPRequest的Web 服务URL?
- Qt中QAction在菜单栏、工具栏、状态来上的使用及添加快捷键
- 一般处理程序中使用隐藏域来实现非Form表单元素上数据的改变
- 在js中改变单选框选中状态
- 处理运行时状态的改变
- 处理App状态改变的策略
- 在MFC GridCtrl中使用CGridCellCheck类根据GetCheck()状态做不同处理的实现
- 在MFC GridCtrl中使用CGridCellCheck类根据GetCheck()状态做不同处理的实现
- 利用X-UA-Compatible定义网页在IE下的兼容状态
- 在Android中使用OpenCv 来处理图片
- 为你写诗
- WM5.0中添加弹出菜单(即上下文菜单)
- 如何做好售前技术支持工作(转载)
- 习题 ct5_3: 恶魔数字7★
- matlab中用于小数取整的函数的用法
- 在SipServlet中使用SipSession或SipApplicationSession来处理UA状态的改变
- Silverlight页面点击按钮,退出应用程序
- 信号处理
- 一个关于异步io很赞的文章
- c++编译链接过程
- C语言中extern修饰符的用法
- 对ActiveX控件进行注册
- 不用关联Eclipse,Jboss实现发布工程
- 指定的命名连接在配置中找不到、非计划用于 EntityClient 提供程序或者无效