作为java的初学者,看了网上的资料后,关于java的长短连接,感觉理解的不是很深刻,结合自己的学习和网上的资料整理如下,不正确之处请大家批评指正。
其实作为java语言本身而言,能够提供给我们使用的最终的网络接口实际也就是java的Socket API,除此外别无他物。 所以我们经常提到的HTTP和Netty 长短连接实际都是针对的java Socket而言的,大家都学过网络的7层模型,但是在JAVA中7层模型显的过于的复杂,大多数的层,我们无法直接感知。实际简化为如下的图是较为准确的:
HTTP的长短连接:
何为HTTP长连接,准确的说HTTP是无状态的连接,每一次请求完毕后,实际客户端和服务器端在应用层是没有任何连接的,也就是所谓的每一次请求建立一次连接,无状态的,但是为什么还有HTTP长连接之说呢?那是因为HTTP作为应用层的协议其实际依赖的是底层的TCP协议,TCP协议大家都非常的熟悉也就是三次握手的可靠连接,可以多次可靠的传递IP数据包。所以在HTTP的协议中,有一个属性是:Connection:keep-alive,设置了该属性则是浏览器告诉服务器请使用HTTP长连接方式,实际也就是TCP长连接,也就是浏览器实际和服务器之间在完成一次HTTP请求后并没有真正的关闭底层Socket连接,下一次的请求还是继续的使用这个连接。
以Tomcat为例子,实际Tomcat 在HTPP长连接方式下,当一个新的HTTP请求来临则打开一个Socket处理请求完毕后,TOMCAT并没有立即调用java 关闭Socket的方法关闭连接,而是维持了这个连接,当然此时如果浏览器关闭了,那这个TCP链路也就关闭了(关于如何维持一个TCP连接不中断,这个超出的本文的讨论范围,只需要记住只要没有显式去关闭已创建的Socket连接,则保持着TCP的连接)。大家知道网络资源也是很珍贵的,所以Tomcat不能一直维持着这个连接,当上次请求时间大于用户设置的Session 有效时间到来时,则会主动关闭这个连接,这个时间是可以设置的。当然也可以不设置这个字段,那实际就是告诉服务器,请每次创建连接,一次请求后则直接关闭,这种情况是相当的耗费资源的,实际也就是HTTP的短连接。Tomcat等都是默认的TCP长连接。
JAVA NIO的长短连接:
JAVA的NIO 大家都非常的熟悉了,基于NIO的netty等传输协议也是非常的多,这些框架都号称实现了长连接,实际其依赖的网络底层依旧是java的Socket 接口。其实也就是在传输的过程中,java的Socket并没有随着数据传输的完成而关闭,而是一直维持着这个TCP的连接,等下次使用依旧使用这个连接(同上,关于如何维持TCP的长连接超出的本文的讨论范围)。而以netty为例子,是支持用户指定初始化方式的,即类似于HTTP,可以设置是使用长连接还是短连接。
附:
关于底层是如何维持TCP长连接的,可以参考《TCP/IP详解》一书,有详细的介绍。总之就是服务器和客户端之间建立一个探测心跳,不断的侦断对方是否依旧存在,如果没有收到对方的反馈信息,可以认为对方的连接已经断了,那么服务器会考虑关闭TCP连接,如果对方在一定的时间又发送了侦断信息,则认为又连接上了。
总之,通过TCP的长连接,维持了一个对应用层透明的链路,应用层可以反复的使用这个链路传输数据,而保存高效,避免了三次握手建立连接和四次握手关闭连接所带来的资源浪费和资源消耗。
相关推荐
java网络连接数据库 图文都有比较详细java网络连接数据库 图文都有比较详细java网络连接数据库 图文都有比较详细java网络连接数据库 图文都有比较详细
Java网络编程_连接网络数据库的多种方法
JAVA 使用数据库连接池连接Oracle数据库,全代码,附加详细说明
JAVA小程序,用于检查网络连接是否正常,可根据IP或URL来检查。
Java实现Socket长连接和短连接,实现原理可参见个人博客
Java是一种跨平台、健壮、安全、可移植,适合于分布式计算机环境的面向对象的编程语言,由于用Java开发的程序...本文结合Java网络编程的特点,介绍了基于TCP/IP协议如何建立TCPSocker实现与网络数据库连接的几种常用方法。
java源代码,通过telnet方式连接服务器,可以设置是否记录日志等信息。经过稍微改动可以实现类似crt软件的功能。
公司需要一个用户下单后自动打印订单金额发票和快递单号的功能,所以特地写的工具类。...具体作用是:java通过网络,调用网络打印机,打印自定义内容,比如快递单号、发票等等,文档中附带了部分快递公司的快递单模版。
Java网络编程-多个例子,多线程,连接池,文件传输
RabbitMQ客户连接池的Java实现。我们刚开始也是采用这种方式来实现的,但做压力测试时,发现这种每次新建Connection和新建Channel是非常耗时的,在大并发下,一般都要8毫秒左右,慢的话,好多都是几十毫秒。因此我们...
java me 网络连接实例创建了一个连接 创建了一个连接 创建了一个连接
java socket 的长连接实例,服务器端支持多个客户端连接,服务器端支持客户端的掉线检测。多线程编程
通过POS命令/TSCLIB/JAVA类库三种方式实现打印小票,提供完整示例,可选方式较多
Java网络聊天室简介:程序能够连接他人主机(局域网内)、能够进行用户的注册、登录、用户密码的修改;同时能够给对方发送文字内容,并且能够显示聊天时间;局域网内聊天不能超过50个连接(因为服务器套接字...
Java实现远程桌面连接的properjavardp源码工程,可直接运行。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。...
JAVA连接SAP的官方接口(通过sapjco3连接)文档 内含java端代码 内容详细 可用来学习
JAVA连接IBM MQ,具体的详细说明,请再csdn上面搜索JAVA连接IBM MQ关键词
java socket长连接客户端服务端(标准实例),准确无误,流行结构。
java 连接数据库 lookandfeel java网络编程 java 连接3大数据库,各种风格的窗口主题,C/S版的java网络编程 java 举例(源代码)
使用java技术获取本地网络连接信息的简单代码:包括网卡信息,IP地址,物理地址,默认网关,子网掩码以及DNS等信息