Sipdroid实现SIP(四): 传输层和应用层之间的枢纽SipProvider

I. 概述

在整套Sipdroid源码中, 类SipProvider是最靠近TCP/UDP的一层, 在Sipdroid实现的SIP协议栈中扮演底层枢纽的角色(前一篇文章中介绍的SipdroidEngine扮演的是上层枢纽), 这一角色也可以从该类是Configurable, TransportListener, TcpServerListener的继承体现出来.

向下层, SipProvider和通信传输层进行交互, 包括接收Transport的回调, 向Transport传递要发送的msg

向上层, SipProvider和UI交互, 包括根据msg触发指定Transaction回调, 从而通知Call再到UserAgent


II.  主要变量

2.1 监听标识之一: ANY

如果接收到的msg, 没有与其匹配的method_id, transaction_id或dialog_id, 就用ANY标识

public static final Identifier ANY = new Identifier("ANY");

2.2 监听标识之二: PROMISQUE

public static final Identifier PROMISQUE = new Identifier("PROMISQUE");

2.3 哈希表存放的接口的对象

在SipProviderListener中, 简单的接口定义和回调方法声明, 接口的对象listeners将会在SipProvider类中发挥重要的作用.

public void onReceivedMessage(SipProvider sip_provider, Message message); 

listeners对象很关键, SipProvider提供的上下层枢纽功能都是要经过对应listener的被动触发和任务派发, Indentifier的值会在下面介绍.

Hashtable<Identifier, SipProviderListener> listeners = null;

2.4 通信协议相关

/*TCP/UDP相关*/
String[] transport_protocols = null;
boolean transport_udp = false;
boolean transport_tcp = false;
static UdpTransport udp = null;
TcpServer tcp_server = null;

/*Socket相关*/
SocketAddress outbound_proxy = null;
private String outbound_addr = null;
private int outbound_port = -1;

III. 主要方法

3.1 初始化SipProvider

从宏观上把握下SipProvider类, 只需要明确以下问题:

  • 初始化SipProvider的位置:
  • 初始化SipProvider需要的参数:
  • 初始化SipProvider后程序发生的变化:

3.2 应用启动时SipProvider监听者列表的变化过程(注册成功):

我删掉了和SipProviderListener无关的代码, 这样就能够显著看到Listener HashTable的变化情况: 在注册前逐个增加listeners, 当注册成功后, 和Register有关的listeners都被删除.

I/System.out: SipProvider: adding SipProviderListener: [email protected]
I/System.out: SipProvider: SipProviderListener:  size=1, [email protected],
I/System.out: SipProvider: adding SipProviderListener: INVITE
I/System.out: SipProvider: SipProviderListener:  size=2, listeners=INVITE, [email protected],
I/System.out: SipProvider: adding SipProviderListener: OPTIONS
I/System.out: SipProvider: SipProviderListener:  size=3, listeners=INVITE, OPTIONS, [email protected],
I/System.out: SipProvider: adding SipProviderListener: [email protected]
I/System.out: SipProvider: SipProviderListener:  size=4, listeners=INVITE, OPTIONS, [email protected], [email protected], -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
I/System.out: SipProvider: removing SipProviderListener: NOTIFY
I/System.out: SipProvider: WARNING: trying to remove a missed SipProviderListener.
I/System.out: SipProvider: SipProviderListener:  size=4, listeners=INVITE, OPTIONS, [email protected]null-z9hG4bK26975, [email protected]null-z9hG4bK84870,
I/System.out: SipProvider: adding SipProviderListener: NOTIFY
I/System.out: SipProvider: SipProviderListener:  size=5, listeners=INVITE, OPTIONS, NOTIFY, [email protected]null-z9hG4bK26975, [email protected]null-z9hG4bK84870,
I/System.out: SipProvider: removing SipProviderListener: [email protected]null-z9hG4bK26975
I/System.out: SipProvider: SipProviderListener:  size=4, listeners=INVITE, OPTIONS, NOTIFY, [email protected]null-z9hG4bK84870,
I/System.out: SipProvider: removing SipProviderListener: [email protected]null-z9hG4bK84870
I/System.out: SipProvider: SipProviderListener:  size=3, listeners=INVITE, OPTIONS, NOTIFY, 

3.3 呼叫请求时监听者列表的变化过程(呼叫失败)

I/System.out: SipProvider: removing SipProviderListener: INVITE
I/System.out: SipProvider: SipProviderListener:  size=2, listeners=OPTIONS, NOTIFY,
I/System.out: SipProvider: adding SipProviderListener: [email protected]null
I/System.out: SipProvider: SipProviderListener:  size=3, listeners=OPTIONS, NOTIFY, [email protected]null,
I/System.out: SipProvider: adding SipProviderListener: [email protected]null-z9hG4bK26053
I/System.out: SipProvider: SipProviderListener:  size=4, listeners=OPTIONS, NOTIFY, [email protected]null, [email protected]null-z9hG4bK26053,
I/System.out: SipProvider: adding SipProviderListener: [email protected]null-z9hG4bK50097
I/System.out: SipProvider: SipProviderListener:  size=5, listeners=OPTIONS, NOTIFY, 8476420[email protected], [email protected], [email protected]z9hG4bK50097, -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
I/System.out: SipProvider: removing SipProviderListener: [email protected]null
I/System.out: SipProvider: SipProviderListener:  size=4, listeners=OPTIONS, NOTIFY, [email protected]null-z9hG4bK26053, [email protected]null-z9hG4bK50097,
I/System.out: SipProvider: adding SipProviderListener: INVITE
I/System.out: SipProvider: SipProviderListener:  size=5, listeners=INVITE, OPTIONS, NOTIFY, [email protected]null-z9hG4bK26053, [email protected]null-z9hG4bK50097,
I/System.out: SipProvider: adding SipProviderListener: OPTIONS
I/System.out: SipProvider: WARNING: trying to add a SipProviderListener with a id that is already in use.
I/System.out: SipProvider: SipProviderListener:  size=5, listeners=INVITE, OPTIONS, NOTIFY, [email protected]null-z9hG4bK26053, [email protected]null-z9hG4bK50097,
I/System.out: SipProvider: removing SipProviderListener: [email protected]null-z9hG4bK26053
I/System.out: SipProvider: SipProviderListener:  size=4, listeners=INVITE, OPTIONS, NOTIFY, [email protected]null-z9hG4bK50097,
I/System.out: SipProvider: removing SipProviderListener: [email protected]null-z9hG4bK50097
I/System.out: SipProvider: SipProviderListener:  size=3, listeners=INVITE, OPTIONS, NOTIFY, 

3.4 从"哈希监听者列表"删除一个SipProvider监听

时间: 2024-08-06 15:59:40

Sipdroid实现SIP(四): 传输层和应用层之间的枢纽SipProvider的相关文章

网络协议概述:物理层、连接层、网络层、传输层、应用层详解(转载)

这篇文章主要介绍了网络协议概述:物理层.连接层.网络层.传输层.应用层详解,本文用生活中的邮差与邮局来帮助理解复杂的网络协议,通俗易懂,文风幽默,是少见的好文章,需要的朋友可以参考下 信号的传输总要符合一定的协议(protocol).比如说长城上放狼烟,是因为人们已经预先设定好狼烟这个物理信号代表了“敌人入侵”这一抽象信号.这样一个“狼烟=敌人入侵”就是一个简单的协议.协议可以更复杂,比如摩尔斯码(Morse Code),使用短信号和长信号的组合,来代表不同的英文字母.比如SOS(***---*

网络协议分为哪几层---物理层,连接层,网络层,传输层,应用层详解

这篇文章主要介绍了网络协议概述:物理层.连接层.网络层.传输层.应用层详解,本文用生活中的邮差与邮局来帮助理解复杂的网络协议,通俗易懂,文风幽默,是少见的好文章,需要的朋友可以参考下 信号的传输总要符合一定的协议(protocol).比如说长城上放狼烟,是因为人们已经预先设定好狼烟这个物理信号代表了"敌人入侵"这一抽象信号.这样一个"狼烟=敌人入侵"就是一个简单的协议.协议可以更复杂,比如摩尔斯码(Morse Code),使用短信号和长信号的组合,来代表不同的英文字

网络层、传输层、应用层、端口通信协议编程接口 - http,socket,tcp/ip 网络传输与通讯知识总结

引: http://coach.iteye.com/blog/2024511 什么是TCP和UDP,以及二者区别是什么? TCP的全称为传输控制协议.这种协议可以提供面向连接的.可靠的.点到点的通信. UDP全称为用户数据报协议,它可以提供非连接的不可靠的点到多点的通信. 使用TCP还是UDP,那要看你的程序注重哪一个方面,可靠(tcp)还是快速(udp). TCP/IP 建立连接的过程 手机能够使用联网功能是因为手机底层实现了TCP/IP协议,可以使手机终端通过无线网络建立TCP连接.   

TCP/IP入门(3) --传输层

原文:http://blog.csdn.net/zjf280441589/article/category/1854365 传输层的主要功能 1)传输层为应用进程之间提供端到端的逻辑通信(网络层是为主机到主机提供逻辑通信). 2)复用和分用: 复用是指发送方不同的应用进程都可以使用同一个传输层协议传送数据; 分用是指接收方的传输层在剥去报文的首部之后能够把这些数据正确交付到目的应用进程. 3)传输层还会对收到的报文进行差错检测(首部和数据部分), 而网络层只检查IP数据报的首部, 不检验数据部分

计算机网络(二)——传输层

从通信和信息处理的角度来看,传输层向它上面的应用层提供通信服务,它属于面向通信部分的最高层,同时也是用户功能的最底层,针对于上三层的资源子网与下三层的通信子网,传输层在两者之间扮演者承上启下的作用: 传输层的两个主要协议: UDP协议与TCP/IP协议 UDP协议:用户数据报协议 它是一种不可靠的传输协议,在传输过程中,它不提供反馈,单单只是把传输的数据传送到目的地址当中,对于UDP协议来说,应用层才会保证数据的可靠性:他的通信过程不如TCP/IP那样更可靠,也不具备数据恢复功能: UDP是无连

(传输层)TCP协议

目录 首部格式数据单位特定注意自动重传请求ARQ具体实现发送缓存接收缓存滑动窗口确认丢失和确认迟到超时重传时间选择报文段的发送时机运输连接发送TCP请求客户端拥塞处理相关概念避免拥塞具体实现TCP 的有限状态机 首部格式 图释: 各个段位说明: 源端口和目的端口: 各占 2 字节.端口是传输层与应用层的服务接口.传输层的复用和分用功能都要通过端口才能实现 序号: 占 4 字节.TCP 连接中传送的数据流中的每一个字节都编上一个序号.序号字段的值则指的是本报文段所发送的数据的第一个字节的序号 确认

前端工程师如何理解 TCP/IP 传输层协议?

网络协议是每个前端工程师都必须要掌握的知识,TCP/IP 中有两个具有代表性的传输层协议,分别是 TCP 和 UDP,本文将介绍下这两者以及它们之间的区别. TCP/IP网络模型 计算机与网络设备要相互通信,双方就必须基于相同的方法.比如,如何探测到通信目标.由哪一边先发起通信.使用哪种语言进行通信.怎样结束通信等规则都需要事先确定.不同的硬件.操作系统之间的通信,所有的这一切都需要一种规则.而我们就把这种规则称为协议(protocol). TCP/IP 是互联网相关的各类协议族的总称,比如:T

传输层TCP协议

Tcp协议概念 TCP(传输控制协议 Transmission Control Protocol)是一种传输层通信协议.它在应用程序间建立了一条虚拟链路.在TCP/IP协议中传输层具有四个主要任务:组包.通过滑动窗口实现连接控制.寻址和通过序号确认来提供可靠性.TCP具有6个特点:面向连接的传输:端到端的通信:高可靠性,确保传输数据的正确性,不出现丢失或乱序:全双工方式传输:采用字节流方式,即以字节为单位传输字节序列:紧急数据传送功能. TCP报文和TCP首部结构 TCP数据被封装在一个IP数据

ASP.NET知识总结(1.网络传输层)

1.网络传输层 1应用层(HTTP.FTP.SMTP)报文Message 2传输层(TCP.UDP)报文段Segment,为运行在不同主机上的应用程序进程间提供数据 传输服务.通过套接字(Socket)实现. TCP(传输控制协议)面向连接的.可靠(应用:ftp.smtp.http等都是基于tcp) UDP(用户数据报协议)无连接的.不可靠的(数据报)应用:视频会议.网络电话. DNS解析.(速度快,能容忍部分数据丢失) 3网络层(IP)数据报datagram,把数据从一台主机移动到另一台主机,