[SIP]Message

简介: [SIP]Message

在SipServlet中,


doMessage(SipServletRequest request)


这个方法主要用来处理接收到的message.


下面一段简单的代码:


@Override
    protected void doMessage(SipServletRequest req) throws ServletException, IOException{
        SipApplicationSession sas = this.getSas(req.getFrom());//取得用户A的SipApplicationSession
        if(sas != null){
            Proxy proxy = req.getProxy();//取得Proxy
            proxy.setRecordRoute(true);
            proxy.setSupervised(true);
            SipUser sipuser = this.getSipuser(req.getTo());
            if (sipuser != null){
                proxy.proxyTo(sipuser.getContact());//将请求代理给B
            }
        }
    }

上面的代码的功能,主要是使用代理方式,


转发Message给B.



现在需要将请求重构后再转发:


于是,取消了使用Proxy的方式.


SipUser su = null;
        su = this.getSipuser(req.getTo();//取得用户B
        if(su == null){
            req.createResponse(SipServletResponse.SC_NOT_FOUND).send();//如果不存在,返回404给A
        } else {
            req.createResponse(SipServletResponse.SC_OK).send();//如果存在返回200OK给A
//创建新的请求
            SipServletRequest newReq = sf.createRequest(sf.createApplicationSession(), req.getMethod(), Sipfrom, Sipto);
            //set Message设置请求
            Object content = null;
            content = req.getContent();
            String contentType = "";
            contentType = req.getContentType();
            if(content != null && !(contentType.equals("")))
                newReq.setContent(content, contentType);
            URI contact = sf.createURI(su.getContact().toString());
            newReq.setRequestURI(contact); //设置请求的URI
            newReq.send();//发送请求给B
        }
        if(req.getApplicationSession() != null)
            req.getApplicationSession().invalidate();//使A的SipApplicationSession失效,可以减少内存

的损耗.


之前因为忘记了添加newReq.setRequestURI(contact); 部分的代码,


那个纠结啊,真不是一般人能体会的.


呵呵.


特此记录一下,免得下次犯同样的错误.


相关文章
|
消息中间件 C语言
zframe_send发送的内容,可以使用zmq_recv接收吗
如果你在同一套接字上混合使用CZMQ的zframe_send和ZMQ的zmq_recv,可能会遇到问题,因为这两个函数可能对ZMQ的内部状态有不同的预期。
87 0
EMQ
|
7月前
|
Linux 网络性能优化
MQTT 5.0 报文解析 03:SUBSCRIBE 与 UNSUBSCRIBE
在 MQTT 中,SUBSCRIBE 报文用于发起订阅请求,SUBACK 报文用于返回订阅结果。而 UNSUBSCRIBE 和 UNSUBACK 报文则在取消订阅时使用。相比于取消订阅,订阅操作更加常用。不过在本文中,我们仍然会一并介绍订阅与取消订阅报文的结构与组成。
EMQ
399 7
MQTT 5.0 报文解析 03:SUBSCRIBE 与 UNSUBSCRIBE
|
7月前
|
安全 Java Shell
Android发送广播时报错:Sending non-protected broadcast xxxxxxx from system xxxxxxxxxx
Android发送广播时报错:Sending non-protected broadcast xxxxxxx from system xxxxxxxxxx
1031 0
EMQ
|
6月前
|
安全 开发工具 数据安全/隐私保护
MQTT 5.0 报文解析 06:AUTH
MQTT 5.0 引入了增强认证特性,它使 MQTT 除了简单密码认证和 Token 认证以外,还能够支持质询/响应风格的认证。为了实现这一点,它在原先 CONNECT 和 CONNACK 报文的基础上,又引入了 AUTH 报文来实现任意多次的认证数据交换,以支持各种不同类型的认证机制,例如 SCRAM、Kerberos 认证等等。
EMQ
311 7
MQTT 5.0 报文解析 06:AUTH
EMQ
|
7月前
|
JSON Linux 网络性能优化
MQTT 5.0 报文解析 02:PUBLISH 与 PUBACK
本文将介绍在 MQTT 中用于传递应用消息的 PUBLISH 报文以及它的响应报文。不管是客户端向服务端发布消息,还是服务端向订阅端转发消息,都需要使用 PUBLISH 报文。决定消息流向的主题、消息的实际内容和 QoS 等级,都包含在 PUBLISH 报文中。
EMQ
430 13
MQTT 5.0 报文解析 02:PUBLISH 与 PUBACK
EMQ
|
7月前
|
Linux 网络性能优化 数据安全/隐私保护
MQTT 5.0 报文解析 01:CONNECT 与 CONNACK
如果我们想要使用 MQTT 进行通信,第一步必然是建立一个 MQTT 连接,而建立 MQTT 连接需要用到两个控制报文,它们分别是 CONNECT 报文与 CONNACK 报文。CONNECT 报文是客户端与服务端建立网络连接后,向服务端发送的第一个控制报文,用来发起连接请求。服务端将返回 CONNACK 报文告知客户端连接结果。
EMQ
923 11
MQTT 5.0 报文解析 01:CONNECT 与 CONNACK
|
7月前
|
JSON 物联网 数据格式
什么是MQTT 遗嘱消息(Will Message)
【2月更文挑战第17天】
517 7
什么是MQTT 遗嘱消息(Will Message)
|
7月前
|
监控 网络协议 网络安全
ICMP (Internet Control Message Protocol,互联网控制消息协议)
ICMP(Internet Control Message Protocol,互联网控制消息协议)是用于在IP网络中传递控制消息的协议。它通常被用于网络设备之间交换状态信息和错误报告,以及执行网络诊断和故障排除。
248 0
|
7月前
|
算法 安全 数据安全/隐私保护
浅浅学习一下消息认证码MAC(Message Authentication Code)
浅浅学习一下消息认证码MAC(Message Authentication Code)
296 0