ARTSPConnection对RTSP流的连接过程
2017-03-08 11:52
288 查看
下面贴出安卓N版本ARTSPConnection::connect的调用流程:
小结:ARTSPConnection::onConnect函数是对ARTSPConnection::connect发送的消息名为kWhatConnect的处理。具体处理的事情是获取到reply消息的引用(该消息的消息名为”conn”,消息的处理者为MyHandler),获取到参数url,从参数url里解析出主机号host,路径path,端口号port,然后调用函数performConnect(reply, host, port)来完成RTSP流的连接。
==> void ARTSPConnection::connect(const char *url, const sp<AMessage> &reply) { //新建消息msg,消息名为kWhatConnect,消息的处理者为this也就是ARTSPConnection //那么,消息名为kWhatConnect消息的处理则会在ARTSPConnection::onMessageReceived 的case kWhatConnect处理分支中 //将传进来的两个参数url和reply消息引用分别添加到msg消息的"url"和"reply"字段中 sp<AMessage> msg = new AMessage(kWhatConnect, this); msg->setString("url", url); msg->setMessage("reply", reply); msg->post(); } ==> void ARTSPConnection::onMessageReceived(const sp<AMessage> &msg) { switch (msg->what()) { case kWhatConnect: //调用onConnect(msg)函数对该消息进行处理完成后续的连接 onConnect(msg); break; case kWhatDisconnect: onDisconnect(msg); break; case kWhatCompleteConnection: onCompleteConnection(msg); break; case kWhatSendRequest: onSendRequest(msg); break; case kWhatReceiveResponse: onReceiveResponse(); break; case kWhatObserveBinaryData: { CHECK(msg->findMessage("reply", &mObserveBinaryMessage)); break; } default: TRESPASS(); break; } } ==> void ARTSPConnection::onConnect(const sp<AMessage> &msg) { ++mConnectionID; //初次调用onConnect函数必须是DISCONNECTED状态,否则进行相应的异常处理 if (mState != DISCONNECTED) { if (mUIDValid) { HTTPBase::UnRegisterSocketUserTag(mSocket); HTTPBase::UnRegisterSocketUserMark(mSocket); } close(mSocket); mSocket = -1; flushPendingRequests(); } //将状态设置为CONNECTING状态,表示正在进行连接 mState = CONNECTING; //从消息里得到参数url和reply消息(注:此消息的消息名为"conn",消息的处理者为MyHandler) AString url; CHECK(msg->findString("url", &url)); sp<AMessage> reply; CHECK(msg->findMessage("reply", &reply)); //调用ParseURL函数从url.c_str()里解析出主机号host,路径path,端口号port //其中主机号host,路径path是AString类型的字符串,port是unsigned类型的整数 //具体是如何解析的后续文章会向大家介绍 AString host, path; unsigned port; if (!ParseURL(url.c_str(), &host, &port, &path, &mUser, &mPass) || (mUser.size() > 0 && mPass.size() == 0)) { // If we have a user name but no password we have to give up // right here, since we currently have no way of asking the user // for this information. ALOGE("Malformed rtsp url %s", uriDebugString(url).c_str()); reply->setInt32("result", ERROR_MALFORMED); reply->post(); mState = DISCONNECTED; return; } if (mUser.size() > 0) { ALOGV("user = '%s', pass = '%s'", mUser.c_str(), mPass.c_str()); } host //传递参数reply消息,主机号host,和端口号port来调用函数performConnect完成连接 performConnect(reply, host, port); }
小结:ARTSPConnection::onConnect函数是对ARTSPConnection::connect发送的消息名为kWhatConnect的处理。具体处理的事情是获取到reply消息的引用(该消息的消息名为”conn”,消息的处理者为MyHandler),获取到参数url,从参数url里解析出主机号host,路径path,端口号port,然后调用函数performConnect(reply, host, port)来完成RTSP流的连接。
相关文章推荐
- ARTSPConnection::performConnect函数完成RTSP流的连接
- len、right的意义,如何调用子过程,VB连接ACCESS,WTTH语句
- 超级连接在值的传递过程中发生丢失
- 本地连接状态 属性按钮消失 解决过程(DCOM配置问题)(原创*转载留名)
- 已成功与服务器建立连接,但是在登录过程中发生错误。 (provider: 共享内存提供程序, error: 0 - 管道的另一端上无任何进程。)
- 让每个页面的生命周期过程只产生一个Connection连接
- 数据库操作_连接SQL Server数据库示例;连接ACCESS数据库;连接到 Oracle 数据库示例;SqlCommand 执行SQL命令示例;SqlDataReader 读取数据示例;使用DataAdapter填充数据到DataSet;使用DataTable存储数据库表;将数据库数据填充到 XML 文件;10 使用带输入参数的存储过程;11 使用带输入、输出参数的存储过程示;12 获得数据库中表的数目和名称;13 保存图片到SQL Server数据库示例;14 获得插入记录标识号;Exce
- 客户端sqlplus连接oracle的过程
- 已成功与服务器建立连接,但是在登录过程中发生错误。 (provider: 共享内存提供程序, error: 0 - 管道的另一端上无任何进程。)
- 外连接的精髓(执行过程)
- 为什么连接时候可以直接调用储存过程,而没有事先声明
- TCP协议连接过程详解
- 我在做Hessian(http)短连接版本转Tessian(TCP)长连接中间件的过程中翻译的hessian官方文档
- 清除某个数据库的所有数据库连接的存储过程 [ZT]
- asp 通用数据库连接过程函数
- 求救一个关于commons-httpclient组件在网络连接过程中的速度问题,好奇怪啊。。。
- C++学习体会--预处理,编译过程,连接过程
- jdbc连接过程
- tcp连接/断开过程详述
- 已成功与服务器建立连接,但是在登录过程中发生错误。 (provider: 共享内存提供程序, error: 0 - 管道的另一端上无任何进程。)