异步请求新做法
2014-03-15 17:03
134 查看
类似WebQQ对话的异步请求做法:
场景:
WebQQ聊天时,如果A、B都处于登陆状态,A发送消息给B,B端必须有一个请求监听服务端消息池,我们想到的做法就是不断发送request请求轮检,但是轮检的周期设定多长时间合适呢,同时在这个周期中是否能保证及时监测到结果,也就是说尽量减少延迟时间,但是减少延迟周期不能以缩短请求周期为代价,因为周期缩短了也就意味着请求个数增加了,请求个数增加对服务器的压力自然也会增加。
解决方案:
在客户端定期如2~3分钟(这种频率算是比较小的请求频率了)发送一个异步请求到服务端,前面的做法一样都是用轮检,但是不同的是服务端的做法——在服务端重写异步请求的接口IHttpAsyncHandler,在BeginProcessRequest返回IHttpAsyncHandler时设定范围结果的IsCompleted为false,这样服务端的请求就不会直接返回到客户端,也就是说检测不到消息的时候让请求处于继续等待的状态,那么,什么时候解除这种等待状态呢?第一种、TimeOut的时候系统自动解除;第二种、调用线程池中的方法:,在回调函数asyncResult.Complete中设定asyncResult.的IsCompleted为true即可
也就是说,当服务端检测到信息时,客户端的请求是还保持连接的,而调用QueueUserWorkItem马上就可以响应客户端的请求
这种做法可以实现即时聊天的功能
我们平台的消息机制以后会改成这种做法。
代码如下:
重写BeginProcessRequest,当没有接收到消息时返回的IAsyncResult的IsCompleted属性设为false,客户端将继续保持连接,直到timeOut或者调用函数
客户端才会接收服务端发回的信息
重写BeginProcessRequest,当没有接收到消息时返回的IAsyncResult的IsCompleted属性设为false,客户端将继续保持连接,直到timeOut或者调用函数
客户端才会接收服务端发回的信息
场景:
WebQQ聊天时,如果A、B都处于登陆状态,A发送消息给B,B端必须有一个请求监听服务端消息池,我们想到的做法就是不断发送request请求轮检,但是轮检的周期设定多长时间合适呢,同时在这个周期中是否能保证及时监测到结果,也就是说尽量减少延迟时间,但是减少延迟周期不能以缩短请求周期为代价,因为周期缩短了也就意味着请求个数增加了,请求个数增加对服务器的压力自然也会增加。
解决方案:
在客户端定期如2~3分钟(这种频率算是比较小的请求频率了)发送一个异步请求到服务端,前面的做法一样都是用轮检,但是不同的是服务端的做法——在服务端重写异步请求的接口IHttpAsyncHandler,在BeginProcessRequest返回IHttpAsyncHandler时设定范围结果的IsCompleted为false,这样服务端的请求就不会直接返回到客户端,也就是说检测不到消息的时候让请求处于继续等待的状态,那么,什么时候解除这种等待状态呢?第一种、TimeOut的时候系统自动解除;第二种、调用线程池中的方法:,在回调函数asyncResult.Complete中设定asyncResult.的IsCompleted为true即可
也就是说,当服务端检测到信息时,客户端的请求是还保持连接的,而调用QueueUserWorkItem马上就可以响应客户端的请求
这种做法可以实现即时聊天的功能
我们平台的消息机制以后会改成这种做法。
代码如下:
重写BeginProcessRequest,当没有接收到消息时返回的IAsyncResult的IsCompleted属性设为false,客户端将继续保持连接,直到timeOut或者调用函数
客户端才会接收服务端发回的信息
重写BeginProcessRequest,当没有接收到消息时返回的IAsyncResult的IsCompleted属性设为false,客户端将继续保持连接,直到timeOut或者调用函数
客户端才会接收服务端发回的信息
相关文章推荐
- win7(windows 7)系统下安装SQL2005(SQL Server 2005)图文教程
- Java生产者和消费者问题
- hdu 4003 Find Metal Mineral (树形dp)
- 字符设备(4)ioctl
- BZOJ 1001: [BeiJing2006]狼抓兔子
- 开辟动态数组、printf
- 【ubuntu 12.04 安装cmake】
- POJ 3067 Japan(树状数组:求逆序)
- ubuntu12.04下面codeblocks配置opencv2.4.6
- 2012-10-20 NOIP模拟赛
- PHP的多版本环境管理
- 安装JDK出现"Windows Installer程序包有问题,此安装需要的DLL不能运行"解决方法
- 数组中的某两个数只出现一次
- csdn第四届在线编程大赛·线上初赛:带通配符的数
- vim编辑器颜色主题color scheme
- Linux下C编写基本的多线程socket服务器
- TFS二次开发01——TeamProjectsPicher
- sql server2008安装图解
- jQuery扩展实现复选框批操作
- 在同一应用程序中同一窗体只打开一个