在日常项目中,大多的时候我们用的是短连接,一个请求过来,一个线程处理完该请求,线程被线程池回收,这个请求就关闭了.虽然这能满足很大部分的需求,但是也有些问题,比如说:如果客户端发的请求比较多,比较频繁,服务端就会忙于建立连接处理请求,由于服务端的线程数也有限,并发比较大的话有可能会造成服务端的崩溃.那有没有一种办法使连接少一些,让一个线程可以处理多个连接?长连接的出现就是为了解决上面的问题.
1.基于http协议的长连接
在HTTP1.0和HTTP1.1协议中都有对长连接的支持。其中HTTP1.0需要在request中增加”Connection: keep-alive“ header才能够支持,而HTTP1.1默认支持.
http1.0请求与服务端的交互过程:
a)客户端发出带有包含一个header:”Connection: keep-alive“的请求
b)服务端接收到这个请求后,根据http1.0和”Connection: keep-alive“判断出这是一个长连接,就会在response的header中也增加”Connection: keep-alive“,同是不会关闭已建立的tcp连接.
c)客户端收到服务端的response后,发现其中包含”Connection: keep-alive“,就认为是一个长连接,不关闭这个连接。并用该连接再发送request.转到a)
http1.1请求与服务端的交互过程:
a)客户端发出http1.1的请求
b)服务端收到http1.1后就认为这是一个长连接,会在返回的response设置Connection: keep-alive,同是不会关闭已建立的连接.
c)客户端收到服务端的response后,发现其中包含”Connection: keep-alive“,就认为是一个长连接,不关闭这个连接。并用该连接再发送request.转到a)
基于http协议的长连接减少了请求,减少了建立连接的时间,但是每次交互都是由客户端发起的,客户端发送消息,服务端才能返回客户端消息.因为客户端也不知道服务端什么时候会把结果准备好,所以客户端的很多请求是多余的,仅是维持一个心跳,浪费了带宽.
2.基于Jetty Continuation实现的长连接
在jetty6中,实现了一种"使HTTP请求可以被暂时挂起,并且当挂起超时或非同步的事件发生时,被挂起的HTTP请求可以被重新恢复"的机制.即一个请求过来后,发现服务端的数据还没准备好,就将该请求放入队列,处理该请求的线程放入线程池处理其它的请求,等数据准备好后再处理该请求,客户端收到数据后再发起新的请求.
这样就可以减少客户端的请求,保证每个发出的请求都有数据返回,同时不会一直占用一个线程不放,增加服务端线程的使用效率,这个方式又叫"长轮询".
3.基于Servlet3实现的长连接
Servlet3可以实现一旦请求被服务端接受就不再关闭连接,直到超时事件发生才重新建立新的连接 .它和基于http协议不同的是连接不会一直占用线程,并且一旦服务端数据准备好就可以发给客户端,不需要客户端来询问有没有准备好,客户端收到消息好,连接还在,不用重新建立连接.不会浪费带宽,也不会浪费请求,这种方式又叫"Comet 流".
分享到:
相关推荐
虽然WebService被广泛认为是SOA的一个实现方式,但它并不是SOA的全部。SOA的理想状态是实现传输协议的透明化,而SOAP作为一个特有协议,并未完全达到这一点。 在Java中,主要存在三种WebService实现规范: 1. JAX-...
### 几种常用的表连接方式详解 在数据库领域,表连接是数据检索和管理的核心技术之一,用于将多个数据表中的信息结合在一起,形成更完整、更有意义的数据集。本文将深入探讨四种常用的表连接方式:嵌套循环连接、...
在"MINA长连接框架实现通讯"的场景中,我们要讨论的核心知识点包括以下几个部分: 1. **MINA框架基础**:MINA是一个基于NIO(Non-blocking I/O)的框架,它提供了一种处理大量并发连接的方式,通过非阻塞I/O模型,...
本篇文章将详细介绍在Java中连接Oracle数据库的几种常见方法,以及相关的源码示例。 1. JDBC-ODBC桥连接: JDBC-ODBC桥是Java早期连接数据库的一种方式,它依赖于操作系统上的ODBC数据源。首先,你需要在系统中...
Apache与Tomcat的几种连接方式介绍 Apache与Tomcat的连接方式是Web开发中非常重要的一部分。Tomcat本身已经提供了HTTP服务,该服务默认的端口是8080,但我们仍然需要引入Apache或其他专门的HTTP服务器来提高静态...
根据提供的文件信息,本文将详细探讨连接数据库的几种方法,并结合具体的代码实例进行解析。主要涉及的方法包括:通过 JDBC 直接连接、使用数据源(DataSource)的方式以及配置文件加载方式来连接数据库。 ### 一、...
Comet主要有两种实现方式:HTTP长轮询和HTTP流。 1. HTTP长轮询:客户端发起一个请求,服务器保持连接不立即关闭,直到有新消息时才返回响应。一旦响应被客户端接收,客户端再次发起请求,如此循环,形成长连接。 ...
实现一个socket客户端的长连接主要包括以下几个步骤: 1. **创建Socket对象**:在客户端,使用`java.net.Socket`类创建一个Socket实例,指定服务器的IP地址和端口号。 2. **建立连接**:调用`Socket`对象的`...
在C#中实现异步长连接通常涉及以下几个关键步骤: 1. **创建Socket对象**:首先,你需要实例化一个Socket对象,并设置其属性,如ProtocolType.Tcp表示使用TCP协议。 2. **绑定和监听**:对于服务器端,使用Socket...
本文将介绍几种使用Java来实现`ping`功能的方法。 #### 方法一:纯Java实现ICMP的ping命令 在Java中,可以不依赖于操作系统提供的`ping`命令或任何其他外部工具,通过编程的方式直接发送ICMP包来实现`ping`功能。...
本篇文章将详细探讨Delphi中常见的几种数据库连接方式,帮助开发者更好地理解和应用。 一、Borland Database Engine (BDE) BDE,全称为Borland Database Engine,是早期Delphi版本中广泛使用的数据库连接技术。它...
"TL431及TLP521的光耦反馈电路几种连接方式及其工作原理" 本文将详细分析TL431及TLP521光耦反馈电路的几种连接方式及其工作原理。 一、TL431及TLP521的基本特性 TL431是一种电压误差放大器,具有高线性度和高Gain...
本文档主要介绍了四种常用的表连接方式:嵌套循环连接、排列合并连接、哈希连接和索引连接。 1. **嵌套循环连接**: - 嵌套循环连接是通过遍历外部表(驱动表)的每一行,并与内部表的每一行进行比较来实现的。...
以下将详细介绍几种常见的Delphi数据库连接方法: 1. **ADO(ActiveX Data Objects)** ADO是Microsoft提供的数据访问接口,通过COM组件与数据库进行通信。在Delphi中,可以使用TADOConnection、TADOCommand等...
在本文中,我们将深入探讨如何使用Go(Golang)语言实现一个长连接服务,特别针对基于房间的聊天推送场景。Go语言因其高效的并发处理、内存管理和简洁的语法,成为构建网络服务的理想选择。我们将讨论以下几个关键...
在ASP.NET中实现Server Push,通常有以下几种方法: 1. **SignalR**:SignalR是ASP.NET的一个库,专为实时Web应用程序设计。它提供了一套API来简化服务器到客户端的推送操作。SignalR处理了连接管理、心跳检测、重...
在Oracle数据库中,为了获取来自多个表的数据,我们需要使用不同的连接方式来实现这一目的。本文将详细介绍三种主要的表连接方式:嵌套循环连接(Nested Loop Join,简称NL Join)、排序合并连接(Sort Merge Join,...
实现HTTP长连接的方式通常有几种: 1. **Keep-Alive头**:HTTP/1.1默认支持持久连接,但客户端可以通过设置`Connection: keep-alive`头来明确要求保持连接。服务器同样可以通过`Keep-Alive`响应头设置连接的最大...