ARTSPConnection::postReceiveReponseEvent启动发送请求循环

本文主要是介绍ARTSPConnection::postReceiveReponseEvent启动发送请求循环,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  下面贴出安卓N版本ARTSPConnection是如何启动向服务端发送请求,接收服务端的响应这样一个循环的:
  

==>
void ARTSPConnection::postReceiveReponseEvent() {//mReceiveResponseEventPending条件变量一旦postReceiveReponseEvent被调用就设置为true,知道整个循环调用达到末端该mReceiveResponseEventPending才会被设置为false,这样保证一次只存在一个这样的循环处理if (mReceiveResponseEventPending) {return;}//新建一个消息msg,消息名为kWhatReceiveResponse,消息的处理者为this,也即ARTSPConnection//则该消息的处理发生在ARTSPConnection::onMessageReceived的case kWhatReceiveResponse处理分支sp<AMessage> msg = new AMessage(kWhatReceiveResponse, this);msg->post();//将mReceiveResponseEventPending变量设置为true,表示当前这样的一个循环正在进行中,不能再产生一次这样的循环。mReceiveResponseEventPending = true;
}==>
void ARTSPConnection::onMessageReceived(const sp<AMessage> &msg) {switch (msg->what()) {case kWhatConnect:onConnect(msg);break;case kWhatDisconnect:onDisconnect(msg);break;case kWhatCompleteConnection:onCompleteConnection(msg);break;case kWhatSendRequest:onSendRequest(msg);break;case kWhatReceiveResponse://调用onReceiveResponse()函数对消息名为kWhatReceiveResponse的消息进行处理onReceiveResponse();break;case kWhatObserveBinaryData:{CHECK(msg->findMessage("reply", &mObserveBinaryMessage));break;}default:TRESPASS();break;}
}==>
void ARTSPConnection::onReceiveResponse() {//这样的一次循环调用接近到了末端,mReceiveResponseEventPending设置为false,表示可以再进行一次这样的循环调用了mReceiveResponseEventPending = false;if (mState != CONNECTED) {return;}//创建一个timeval类型的时间结构体变量struct timeval tv;tv.tv_sec = 0;tv.tv_usec = kSelectTimeoutUs;//创建一个套接字描述符集合rs//并将该套接字描述符集合内存清零fd_set rs;FD_ZERO(&rs);//将之前创建的套接字描述符mSocket添加到该套接字描述符集合中FD_SET(mSocket, &rs);//调用select函数检查套接字描述符集合rs里添加的套接字的状态,//即查询它的可读性、可写性及错误状态信息//在这里查询可读性传入了 &rs,其他两个查询可写性及错误状态信息都是传入的NULL//说明在这里调用者只检查套接字描述符集合rs里套接字的可读性int res = select(mSocket + 1, &rs, NULL, NULL, &tv);if (res == 1) {//刚才只通过FD_SET(mSocket, &rs)向套接字描述符集合rs里添加了一个我们创建的套接字描述符mSocket//所以select函数的返回值res为1说明,套接字描述符mSocket描述的套接口具有可读性//调用MakeSocketBlocking(mSocket, true)函数阻塞该套接口,因为接下来需要从该套接口获取从服务端回应的消息MakeSocketBlocking(mSocket, true);//真正的从套接口获取服务端回应的消息是在receiveRTSPReponse函数里完成//后续文章为大家介绍receiveRTSPReponse函数bool success = receiveRTSPReponse();//成功从该套接口获取到服务端回应的消息后调用MakeSocketBlocking(mSocket, false)函数将该套接口设置为非阻塞状态MakeSocketBlocking(mSocket, false);if (!success) {// Something horrible, irreparable has happened.flushPendingRequests();return;}}//调用postReceiveReponseEvent()函数再次开启这样一次处理,//如此就形成了一个循环postReceiveReponseEvent();
}

  小结:该循环的建立流程是:postReceiveReponseEvent ==> onReceiveResponse ==> postReceiveReponseEvent。这是一个设计技巧,是循环处理某些事务的机制,机制的原理就是形成一个循环调用圈。
  select函数的百科介绍:select(),确定一个或多个套接口的状态,本函数用于确定一个或多个套接口的状态,对每一个套接口,调用者可查询它的可读性、可写性及错误状态信息,用fd_set结构来表示一组等待检查的套接口,在调用返回时,这个结构存有满足一定条件的套接口组的子集,并且select()返回满足条件的套接口的数目。
  

这篇关于ARTSPConnection::postReceiveReponseEvent启动发送请求循环的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1028886

相关文章

Springboot请求和响应相关注解及使用场景分析

《Springboot请求和响应相关注解及使用场景分析》本文介绍了SpringBoot中用于处理HTTP请求和构建HTTP响应的常用注解,包括@RequestMapping、@RequestParam... 目录1. 请求处理注解@RequestMapping@GetMapping, @PostMappin

检查 Nginx 是否启动的几种方法

《检查Nginx是否启动的几种方法》本文主要介绍了检查Nginx是否启动的几种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1. 使用 systemctl 命令(推荐)2. 使用 service 命令3. 检查进程是否存在4

解决idea启动项目报错java: OutOfMemoryError: insufficient memory

《解决idea启动项目报错java:OutOfMemoryError:insufficientmemory》:本文主要介绍解决idea启动项目报错java:OutOfMemoryError... 目录原因:解决:总结 原因:在Java中遇到OutOfMemoryError: insufficient me

SpringBoot项目整合Netty启动失败的常见错误总结

《SpringBoot项目整合Netty启动失败的常见错误总结》本文总结了SpringBoot集成Netty时常见的8类问题及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录一、端口冲突问题1. Tomcat与Netty端口冲突二、主线程被阻塞问题1. Netty启动阻

SpringBoot整合Kafka启动失败的常见错误问题总结(推荐)

《SpringBoot整合Kafka启动失败的常见错误问题总结(推荐)》本文总结了SpringBoot项目整合Kafka启动失败的常见错误,包括Kafka服务器连接问题、序列化配置错误、依赖配置问题、... 目录一、Kafka服务器连接问题1. Kafka服务器无法连接2. 开发环境与生产环境网络不通二、序

Java JAR 启动内存参数配置指南(从基础设置到性能优化)

《JavaJAR启动内存参数配置指南(从基础设置到性能优化)》在启动Java可执行JAR文件时,合理配置JVM内存参数是保障应用稳定性和性能的关键,本文将系统讲解如何通过命令行参数、环境变量等方式... 目录一、核心内存参数详解1.1 堆内存配置1.2 元空间配置(MetASPace)1.3 线程栈配置1.

Java发送SNMP至交换机获取交换机状态实现方式

《Java发送SNMP至交换机获取交换机状态实现方式》文章介绍使用SNMP4J库(2.7.0)通过RCF1213-MIB协议获取交换机单/多路状态,需开启SNMP支持,重点对比SNMPv1、v2c、v... 目录交换机协议SNMP库获取交换机单路状态获取交换机多路状态总结交换机协议这里使用的交换机协议为常

MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决

《MyBatis/MyBatis-Plus同事务循环调用存储过程获取主键重复问题分析及解决》MyBatis默认开启一级缓存,同一事务中循环调用查询方法时会重复使用缓存数据,导致获取的序列主键值均为1,... 目录问题原因解决办法如果是存储过程总结问题myBATis有如下代码获取序列作为主键IdMappe

Python实现简单封装网络请求的示例详解

《Python实现简单封装网络请求的示例详解》这篇文章主要为大家详细介绍了Python实现简单封装网络请求的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录安装依赖核心功能说明1. 类与方法概览2.NetHelper类初始化参数3.ApiResponse类属性与方法使用实

SpringBoot 获取请求参数的常用注解及用法

《SpringBoot获取请求参数的常用注解及用法》SpringBoot通过@RequestParam、@PathVariable等注解支持从HTTP请求中获取参数,涵盖查询、路径、请求体、头、C... 目录SpringBoot 提供了多种注解来方便地从 HTTP 请求中获取参数以下是主要的注解及其用法:1