1 Star 3 Fork 0

ssp / http-long-polling

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

A demo of http-long-polling ——基于HTTP的长轮询

长轮询简介

  • HTTP的通信基本特点:半双工通信、“一请求一响应”。
  • 简单轮询:简单轮询方式是由客户端控制轮询调用间隔。在使用HTTP协议且有一定的实时性要求的业务场景下,一般会通过减小资源调用方对接口的轮询时间间隔来确保“一定的”实时性,但过小的轮询间隔会增大客户端服务端双方CPU和网络等宽等资源消耗,为了权衡资源消耗和实时性,轮询间隔一般不会太短,大多是秒级,从而避免不了有恒定的延时。
  • 长轮询:长轮询机制可缓解简单轮询带有的资源浪费问题,又可以保证更高的实时性。实现思路就是交由服务端控制http-rpc轮询周期来保证实时性,客户端调大socket-timeout读超时时长,服务端在超时前返回响应,这个超时时长可以设置的长一点,如30秒。

长轮询特点

基于HTTP协议的长轮询在实时性上比上websocket稍有不足,比下HTTP简单轮询有余。

实现:基于AsyncContext——servlet异步请求

  • servlet对异步请求做出了规范
package javax.servlet;

public interface ServletRequest {

    public AsyncContext startAsync();
    
    public AsyncContext startAsync(ServletRequest servletRequest, ServletResponse servletResponse);

}
  • 直接在SpringMVC中使用
    HttpServletRequest request; 
    HttpServletResponse response;

    AsyncContext asyncContext = request.startAsync((request, response); //开启异步请求上下文

快速使用

详见io.longpolling.test.controller.ResourceController用例

  • 对客户端请求开启异步任务.
public class ResourceController {

   private static final String RESOURCE_SAY_HELLO = "SayHello";

   @GetMapping("/waitSayHello")
   public void waitSayHello(HttpServletRequest request, HttpServletResponse response, String who, Integer timeout) {
   
       //请求基础信息
       RequestParam curRequestParam = RequestParam.newInstance(RESOURCE_SAY_HELLO, who);
       //响应超时设置及返回结果
       TimeoutResult timeoutResult = TimeoutResult.newInstance(timeout, "Resp Timeout, but hello world for you!", HttpStatus.REQUEST_TIMEOUT);
       
       //开启异步响应
       AsyncResponseTask.buildAndStart(request, response, curRequestParam, timeoutResult);
   }
}
  • 处理异步请求-响应任务
public class ResourceController {

    private static final String RESOURCE_SAY_HELLO = "SayHello";

    @PutMapping("/sayHello")
    public String sayHelloForWe() {
        final Collection<AsyncResponseTask> sayHelloRespTaskWaitList = AsyncResponseTask.getAsyncTask(RESOURCE_SAY_HELLO);
        final int total = sayHelloRespTaskWaitList.size();

        sayHelloRespTaskWaitList.forEach(asyncResp -> {
            RequestParam requestParam = asyncResp.getRequestParam();
            String who = (String) requestParam.getParam();

            String result = String.format("Hello %s!", who);
            asyncResp.returnJsonResult(result, HttpStatus.OK); //完成异步响应

            log.debug("--->say hello for {} success!", who);
        });

        return String.format("say hello for %s people!", total);
    }
}

空文件

简介

基于HTTP的长轮询实现 展开 收起
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
Java
1
https://gitee.com/ssp198/http-long-polling.git
git@gitee.com:ssp198/http-long-polling.git
ssp198
http-long-polling
http-long-polling
master

搜索帮助

53164aa7 5694891 3bd8fe86 5694891