Serlvet 处理http请求并保持长连接

一.Servlet,一个请求在容器中是如何处理的

Servlet规定的,相应客户请求访问特定Servlet流程如下:

1.客户端发出请求。

2.Servlet容器接收客户请求解析。

3.Servlet容器创建一个ServletRequest对象。

其中包含客户请求信息及其他关于客户的信息如请求头,请求正文,客户机的IP等。

4.容器创建一个ServletResponse对象。

5.容器调用客户请求的Servlet的service方法,并且把ServletRequest和ServletResponse作为参数传入。

6.Servlet从客户参数中获得客户请求信息,并调用对应的doGet或doPost处理。

7.Servlet利用ServletResponse对象来生产相应结果。

8.Servlet容器把Servlet生成的结果发给客户。

二.Servlet3.0长连接

servlet3.0规范中添加了异步处理,即一部分操作处理完成之后,先行把数据返回来,对于另一部分比较耗时的操作可以放置到另外一个线程中进行处理,该线程保留有连接的请求和响应对象,在处理完成之后可以把处理的结果通知到客户端,实例代码如下:

[java] view plain copy

print?

  1. import java.io.IOException;
  2. import java.io.PrintWriter;
  3. import java.util.Date;
  4. import javax.servlet.AsyncContext;
  5. import javax.servlet.AsyncEvent;
  6. import javax.servlet.AsyncListener;
  7. import javax.servlet.ServletException;
  8. import javax.servlet.annotation.WebServlet;
  9. import javax.servlet.http.HttpServlet;
  10. import javax.servlet.http.HttpServletRequest;
  11. import javax.servlet.http.HttpServletResponse;
  12. @WebServlet(urlPatterns="/demo", asyncSupported=true)
  13. public class AsynServlet extends HttpServlet {
  14. private static final long serialVersionUID = -8016328059808092454L;
  15. /* (non-Javadoc)
  16. * @see javax.servlet.http.HttpServlet#service(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
  17. */
  18. @Override
  19. protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  20. resp.setContentType("text/html;charset=UTF-8");
  21. PrintWriter out = resp.getWriter();
  22. out.println("进入Servlet的时间:" + new Date() + ".");
  23. out.flush();
  24. //在子线程中执行业务调用,并由其负责输出响应,主线程退出
  25. final AsyncContext ctx = req.startAsync();
  26. ctx.setTimeout(200000);
  27. new Work(ctx).start();
  28. out.println("结束Servlet的时间:" + new Date() + ".");
  29. out.flush();
  30. }
  31. }
  32. class Work extends Thread{
  33. private AsyncContext context;
  34. public Work(AsyncContext context){
  35. this.context = context;
  36. }
  37. @Override
  38. public void run() {
  39. try {
  40. Thread.sleep(2000);//让线程休眠2s钟模拟超时操作
  41. PrintWriter wirter = context.getResponse().getWriter();
  42. wirter.write("延迟输出");
  43. wirter.flush();
  44. context.complete();
  45. } catch (InterruptedException e) {
  46. } catch (IOException e) {
  47. }
  48. }
  49. }

有些时候,我们可能需要客户端和服务器保持长连接的时候,我们可以使用这个特性,让服务器长时间保持客户端的请求以及对客户端的响应,做法如下:

对于异步执行,我们可以添加一个监听器,监听异步执行的状态。

[java] view plain copy

print?

  1. ctx.addListener(new AsyncListener() {
  2. @Override
  3. public void onTimeout(AsyncEvent arg0) throws IOException {
  4. // TODO Auto-generated method stub
  5. }
  6. @Override
  7. public void onStartAsync(AsyncEvent arg0) throws IOException {
  8. // TODO Auto-generated method stub
  9. }
  10. @Override
  11. public void onError(AsyncEvent arg0) throws IOException {
  12. // TODO Auto-generated method stub
  13. }
  14. @Override
  15. public void onComplete(AsyncEvent arg0) throws IOException {
  16. // TODO Auto-generated method stub
  17. }
  18. });

在Servlet返回之前,我们可以把持有request和response对象的AsyncContext对象放置到一个全局可访问的静态容器中

map.put("id",ctx);

如果连接出错或者连接完的时候我们可以在onError以及onComplete方法中移除掉对应连接的AsyncContext

map.remove("id",ctx);

在超时的回调方法onTimeout中,我们可以往浏览器发送指定的信息,让客户端重新发起请求,这样就可以保持客户端和服务器的长久连接。

如下服务器和客户端之间数据交互的模型图

时间: 2024-11-23 16:28:53

Serlvet 处理http请求并保持长连接的相关文章

基于netty框架的socket长连接负载均衡解决方案

socket通讯的单机瓶颈 物联网的项目socket使用方式有两种: 短连接的socket请求 维持socket长连接的请求 对于socket短链接来说就好比是http请求,请求服务器,服务器返回数据以后请求管道就关闭了,服务器与客户端的链接就释放了.但是对于socket长链接就不同了,当设备与服务器建立连接以后就要一直保持连接,或者说保持较长时间的链接,那么就会大量消耗服务器的资源.若存在大量的这样的请求以后服务器终究会受不了垮掉.通过对TcpClient/server最大连接数我们得知单机s

Nginx与Tomcat、Client之间请求的长连接配置不一致问题解决[转]

http://bert82503.iteye.com/blog/2152613 前些天,线上出现“服务端长连接与客户端短连接引起Nginx的Writing.Active连接数过高问题”,这个是由于“服务端使用HTTPs长连接,而客户端使用短连接”引起.这几天,发现Nginx与Tomcat之间也存在同样的问题,原因是两边的相关配置参数不一致引起的.(这是心细活!) 先说说服务为什么使用HTTPs长连接技术?有如下几个原因: 对响应时间要求较高: 服务走的是公网,客户端与服务端的TCP建立的三次握手

HTTP的长连接和短连接——Node上的测试

    本文主要从实践角度介绍长.短连接在TCP层面的表现,借助Node.JS搭建后台服务,使用WinHTTP.Ajax做客户端请求测试,最后简单涉及WebSocket.     关键字:长连接.短连接.Node.JS.WebSocket. 一两年前,在理论上对长短连接做了学习,那时的技能以客户端为主,所以也止步于客户端和网络抓包,两年来后台技术渐有把握,打算从前到后的实践一遍.如对理论有不理解的,可以先google/百度 一下,或者看看这篇偏理论的介绍:HTTP的长连接和短连接. 1 短连接的

【HTTP】长连接和短连接

1. HTTP协议与TCP/IP协议的关系 HTTP的长连接和短连接本质上是TCP长连接和短连接.HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议.IP协议主要解决网络路由和寻址问题,TCP协议主要解决如何在IP层之上可靠的传递数据包,使在网络上的另一端收到发端发出的所有包,并且顺序与发出顺序一致.TCP有可靠,面向连接的特点. 2. 如何理解HTTP协议是无状态的 HTTP协议是无状态的,指的是协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态.也就是说,打开一个服

HTTP长连接和短连接

1.HTTP协议的五大特点1)支持客户/服务器模式2)简单快速3)灵活4)无连接每次连接只处理一个请求,服务器处理完客户的请求,并受到客户的应答后,断开连接.5)无状态协议不会记录服务器客户端状态. 2.保持HTTP连接状态的两种方式1)Cookie在访问统一网站时,可以将信息写入cookie,方便在不同的页面间提取信息. 2)SessionSession保存在服务器上,同时将标识Session的SessionId传递给客户端浏览器,保存在cookie中,浏览器关闭后,这个cookie就会被清掉

HTTP 长连接和短连接

1. HTTP协议与TCP/IP协议的关系 HTTP的长连接和短连接本质上是TCP长连接和短连接.HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议.IP协议主要解决网络路由和寻址问题,TCP协议主要解决如何在IP层之上可靠的传递数据包,使在网络上的另一端收到发端发出的所有包,并且顺序与发出顺序一致.TCP有可靠,面向连接的特点. 2. 如何理解HTTP协议是无状态的 HTTP协议是无状态的,指的是协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态.也就是说,打开一个服

TCP/IP系列——长连接与短连接的区别

1 什么是长连接和短连接 三次握手和四次挥手 TCP区别于UDP最重要的特点是TCP必须建立在可靠的连接之上,连接的建立和释放就是握手和挥手的过程. 三次握手为连接的建立过程,握手失败则连接建立失败. 四次挥手为连接的完整释放过程,也会发生某个消息丢失或者超时的情况,有一方主动发送FIN消息即表示连接即将释放. 注:SYN.ACK.FIN消息具有哪些含义,以及连接的状态,请参考<TCP/IP详解 卷1>第18章. 长连接 长连接,也叫持久连接,在TCP层握手成功后,不立即断开连接,并在此连接的

Web 通信 之 长连接、长轮询(long polling)(转载)

基于HTTP的长连接,是一种通过长轮询方式实现"服务器推"的技术,它弥补了HTTP简单的请求应答模式的不足,极大地增强了程序的实时性和交互性. 一.什么是长连接.长轮询? 用通俗易懂的话来说,就是客户端不停的向服务器发送请求以获取最新的数据信息.这里的“不停”其实是有停止的,只是我们人眼无法分辨是否停止,它只是一种快速的停下然后又立即开始连接而已. 二.长连接.长轮询的应用场景 长连接.长轮询一般应用与WebIM.ChatRoom和一些需要及时交互的网站应用中.其真实案例有:WebQQ

HTTP 长连接 使用场景

offer 80 非常多应用譬如监控.即时通信.即时报价系统都须要将后台发生的变化实时传送到client而无须client不停地刷新.发送请求. 在 多好科技的那位技术指导问我这个是由于他们做物连网,监控,使用长连接多. Comet:基于 HTTP 长连接的"server推"技术 HTML5后 .WebSocket替代 Comet实现 长连接:WebSocket的维基 从WebSocket看到Jetty :  Jetty(Web Server) Google 选择 Jetty 放弃to