RTSP客户端模拟器(TCP方式,Python实现)
2012-10-29 23:40
567 查看
由于某种需求,工作中需要自己要开发RTSP客户端模拟器……这里以DarwinStreamingServer(简称DSS)为例进行演示,把思路记录下来,算是开发了一个测试工具,也方便我以后查阅。在我之前的文章(/article/4902450.html )中介绍过怎样通过TCP的方式来访问DSS,在那个实例中,我用的是VLC作为客户端,通过命令行参数进行调用的。
RTSP数据包截图:
RTP数据包截图:
RTCP数据包截图:
由图可知,在以TCP方式访问DSS时,RTSP数据、RTP数据和RTCP数据都是通过554端口进行传输的,所以DSS服务器只通过554端口和客户端通信。
OPTIONS :查询到服务器所提供的方法;
DESCRIBE :得到会话描述信息(SDP);
SETUP :提醒服务器建立会话,并确定传输模式;
PLAY :客户端发送播放请求;
TEARDOWN :客户端发起关闭请求;
当然中间还有RTP和RTCP的交互,这里就不叙述了。
2、查询服务器所提供的方法
向服务器发送OPTIONS请求,得到服务器所提供的方法。
3、得到会话描述信息
向服务器发送DESCRIBE请求,得到SDP
4、提醒服务器建立会话,并确定传输模式
向服务器发送SETUP请求,通知服务器产生session,并和服务器确定传输模式等。
5、客户端发起播放请求
向服务器发送PLAY请求,通知服务器发送RTP数据。
客户端接收RTP数据
6、客户端发起关闭请求
客户端向服务器发送TREADOWN请求,通知服务器关闭。
完整代码:https://gist.github.com/3974202
个人见解,不足之处欢迎指出。
好,就这些了,希望对你有帮助。
一、通信端口分析
首先通过抓包分析确定数据通信端口。RTSP数据包截图:
RTP数据包截图:
RTCP数据包截图:
由图可知,在以TCP方式访问DSS时,RTSP数据、RTP数据和RTCP数据都是通过554端口进行传输的,所以DSS服务器只通过554端口和客户端通信。
二、通信过程分析
OPTIONS :查询到服务器所提供的方法;
DESCRIBE :得到会话描述信息(SDP);
SETUP :提醒服务器建立会话,并确定传输模式;
PLAY :客户端发送播放请求;
TEARDOWN :客户端发起关闭请求;
当然中间还有RTP和RTCP的交互,这里就不叙述了。
三、模拟器实现
1、建立链接s = socket.socket(socket.AF_INET,socket.SOCK_STREAM) s.connect((m_Vars["defaultServerIp"],m_Vars["defaultServerPort"]))
2、查询服务器所提供的方法
向服务器发送OPTIONS请求,得到服务器所提供的方法。
s.send(genmsg_OPTIONS(m_Vars["defaultTestUrl"],seq,m_Vars["defaultUserAgent"])) print s.recv(m_Vars["bufLen"])
3、得到会话描述信息
向服务器发送DESCRIBE请求,得到SDP
s.send(genmsg_DESCRIBE(m_Vars["defaultTestUrl"],seq,m_Vars["defaultUserAgent"])) msg1 = s.recv(m_Vars["bufLen"]) print msg1
4、提醒服务器建立会话,并确定传输模式
向服务器发送SETUP请求,通知服务器产生session,并和服务器确定传输模式等。
s.send(genmsg_SETUP(m_Vars["defaultTestUrl"] + "/trackID=3",seq,m_Vars["defaultUserAgent"])) msg1 = s.recv(m_Vars["bufLen"]) print msg1 seq = seq + 1 sessionId = decodeMsg(msg1)['Session'] s.send(genmsg_SETUP2(m_Vars["defaultTestUrl"] + "/trackID=4",seq,m_Vars["defaultUserAgent"],sessionId)) msg1 = s.recv(m_Vars["bufLen"]) print msg1
5、客户端发起播放请求
向服务器发送PLAY请求,通知服务器发送RTP数据。
s.send(genmsg_PLAY(m_Vars["defaultTestUrl"] + "/",seq,m_Vars["defaultUserAgent"],sessionId)) msg1 = s.recv(m_Vars["bufLen"]) print msg1
客户端接收RTP数据
while True : msgRcv = s.recv(m_Vars["bufLen"]) if 0 == len(msgRcv) : break print len(msgRcv)
6、客户端发起关闭请求
客户端向服务器发送TREADOWN请求,通知服务器关闭。
s.send(genmsg_TEARDOWN(m_Vars["defaultTestUrl"] + "/",seq,m_Vars["defaultUserAgent"],sessionId)) msg1 = s.recv(m_Vars["bufLen"]) print msg1
完整代码:https://gist.github.com/3974202
四、运行效果
个人见解,不足之处欢迎指出。
好,就这些了,希望对你有帮助。
相关文章推荐
- 转 RTSP客户端模拟器(TCP方式,Python实现)
- RTSP客户端模拟器(TCP方式,Python实现)
- python socket实现简单的(TCP/UDP)服务器/客户端
- python用epoll方式实现客户端对服务端发起大量连接(短连接)
- 2017.8.22 用python实现简单基于TCP/IP的客户端与服务器端
- python用epoll方式实现客户端对服务端发起大量连接(长连接)
- Python中tcp客户端实现代码
- Python中的TCP编程,实现客户端与服务器的聊天(socket)
- Python实现TCP\UDP客户端
- python 网络编程(三)---TCP 服务器端客户端实现
- python---TCP UDP IPv4 IPv6 客户端和服务端的实现
- python实现TCP服务器端与客户端的方法详解
- python网络编程(TCP客户端/服务器端实现)
- python 多线程实现多客户端连接的 TCP Server
- Python实现基于TCP UDP协议的IPv4 IPv6模式客户端和服务端功能示例
- python socket 创建tcp服务器和客户端改进版(实现半双工聊天)
- python实现TCP服务器端与客户端的方法详解
- TCP代理的python实现(包括客户端/服务器/TCP代理三部分代码)
- Python实现基于TCP UDP协议的IPv4 IPv6模式客户端和服务端功能示例
- 利用python实现简单的邮件发送客户端