网站开发需求文档怎么写,seo sem什么意思,品牌宣传策划方案,政务网站建设步骤长连接: 客户端发送Http请求至服务端#xff0c;请求发送完之后socket连接不断开#xff0c;可以继续接收下一个Http请求并且解析返回。接手并解析这些Http请求的时候socket连接不断开#xff0c;这种过程被称为长连接。 需要注意的点就在于#xff0c;在满足什么条件的情况…长连接: 客户端发送Http请求至服务端请求发送完之后socket连接不断开可以继续接收下一个Http请求并且解析返回。接手并解析这些Http请求的时候socket连接不断开这种过程被称为长连接。 需要注意的点就在于在满足什么条件的情况下Tomcat何时会保持长连接何时又会将长连接断开。 BIO伪代码如下
keepAlive truewhile (keepAlive) {//如果连接池中的工作线程/最大线程数75,那么也关闭keepAlive和最后一行的decrementKeepAlive相对应if(disableKeepAlive()){socketWrapper.setKeepAliveLeft(0);}//如果是HTTP/1.1,那么依旧是true如果是HTTP/1.0或者那么将keepAlive设置成false否则直接报错Http协议有问题prepareRequestProtocol();//请求头中的Connection参数如果是keep-alive,那么设置成true如果是close那么设置成falseprepareRequest();//当前socket连接能够处理的最大请求数如果设置成1那么也改成false因为你设置成1说明他只能处理一个请求那么处理完就应该关闭if (maxKeepAliveRequests 1) {keepAlive false;} else if (maxKeepAliveRequests 0 socketWrapper.decrementKeepAlive() 0) {//如果请求数有多个但是超过了当前socket连接上设置的最大限制数那么keepAlive也设置成falsekeepAlive false;}}prepareRequestProtocol() {if (protocolMB.equals(Constants.HTTP_11)) {}else if (protocolMB.equals(Constants.HTTP_10)) {keepAlive false;}else if (protocolMB.equals()) {keepAlive false;}}prepareRequest(){//close设置成falseif (tokens.contains(Constants.CLOSE)) {keepAlive false;} //keep-alive设置成trueelse if (tokens.contains(Constants.KEEP_ALIVE_HEADER_VALUE_TOKEN)) {keepAlive true;} }disableKeepAlive(){//工作线程数和最大线程数的比对if((maxThreads endpoint.getMaxThreadsWithExecutor()) 0 (threadsBusy endpoint.getCurrentThreadsBusy())0)){threadRatio(threadsBusy*100)/maxThreads;//如果大于75%if(threadRatiogetDisableKeepAlivePercentage()){return true}}} 解析伪代码可以看到Tomcat中通过keepAlive属性的开合来保持长连接的开启或者关闭BIO代码中影响KeepAlive的因素有如下几方面: 1.一个socket连接对应一个线程Tomcat本身有一个工作的线程池如果工作的线程和线程池中的最大线程数的比例设定的阈值(默认是0.75)那么就会就会将keepAlive设置成false 2.会根据你的Http版本1.0的设置成false 3.Http请求中的请求头有Connection属性如果传过来的是close那么也会将keepAlive设置成false如果传入的是keep-alive,那么将会设置成true 4.当前socket连接中能够处理的最大请求数如果将其设置成1那么说明这个就是短连接处理完当前Http请求之后就会关闭socket连接将其设置成false 值的注意的是如果2中改成了false但是3中的属性依旧是Connection:keep-alive那么3会覆盖2的结果 上述就是Tomcat中保持长连接以及会影响到长连接开关的因素