JAVA 网络长短连接

简介:

作为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的长连接,维持了一个对应用层透明的链路,应用层可以反复的使用这个链路传输数据,而保存高效,避免了三次握手建立连接和四次握手关闭连接所带来的资源浪费和资源消耗。


目录
相关文章
|
25天前
|
Ubuntu
虚拟机Ubuntu连接不了网络的解决方法
虚拟机Ubuntu连接不了网络的解决方法
|
1月前
|
Shell Linux C语言
【Shell 命令集合 网络通讯 】Linux 关闭PPP(Point-to-Point Protocol)连接 ppp-off命令 使用指南
【Shell 命令集合 网络通讯 】Linux 关闭PPP(Point-to-Point Protocol)连接 ppp-off命令 使用指南
42 1
|
1月前
|
监控 网络协议 Linux
【Shell 命令集合 网络通讯 】Linux 显示网络 连接、路由表和网络接口信息 netstat命令 使用指南
【Shell 命令集合 网络通讯 】Linux 显示网络 连接、路由表和网络接口信息 netstat命令 使用指南
62 1
|
7天前
|
监控 Java 开发者
深入理解 Java 网络编程和 NIO
【4月更文挑战第19天】Java网络编程基于Socket,但NIO(非阻塞I/O)提升了效率和性能。NIO特点是非阻塞模式、选择器机制和缓冲区,适合高并发场景。使用NIO涉及通道、选择器和事件处理,优点是高并发、资源利用率和可扩展性,但复杂度、错误处理和性能调优是挑战。开发者应根据需求选择是否使用NIO,并深入理解其原理。
|
8天前
|
前端开发 NoSQL JavaScript
java域控连接AD遇到的问题
java域控连接AD遇到的问题
|
9天前
|
运维 安全 Cloud Native
安全访问服务边缘(SASE):网络新时代的安全与连接解决方案
SASE(安全访问服务边缘)是一种云基安全模型,结合了网络功能和安全策略,由Gartner在2019年提出。它强调身份驱动的私有网络、云原生架构和全面边缘支持,旨在解决传统WAN和安全方案的局限性,如高延迟和分散管理。SASE通过降低IT成本、提升安全响应和网络性能,应对数据分散、风险控制和访问速度等问题,适用于移动办公、多分支办公等场景。随着网络安全挑战的增加,SASE将在企业的数字化转型中扮演关键角色。
|
9天前
|
网络协议 Java API
深度剖析:Java网络编程中的TCP/IP与HTTP协议实践
【4月更文挑战第17天】Java网络编程重在TCP/IP和HTTP协议的应用。TCP提供可靠数据传输,通过Socket和ServerSocket实现;HTTP用于Web服务,常借助HttpURLConnection或Apache HttpClient。两者结合,构成网络服务基础。Java有多种高级API和框架(如Netty、Spring Boot)简化开发,助力高效、高并发的网络通信。
|
11天前
|
JavaScript Java 测试技术
基于Java的网络游戏交易系统的设计与实现(源码+lw+部署文档+讲解等)
基于Java的网络游戏交易系统的设计与实现(源码+lw+部署文档+讲解等)
26 0
|
11天前
|
SQL 安全 Java
Java安全编程:防范网络攻击与漏洞
【4月更文挑战第15天】本文强调了Java安全编程的重要性,包括提高系统安全性、降低维护成本和提升用户体验。针对网络攻击和漏洞,提出了防范措施:使用PreparedStatement防SQL注入,过滤和转义用户输入抵御XSS攻击,添加令牌对抗CSRF,限制文件上传类型和大小以防止恶意文件,避免原生序列化并确保数据完整性。及时更新和修复漏洞是关键。程序员应遵循安全编程规范,保障系统安全。
|
14天前
|
JavaScript Java 测试技术
基于Java的网络游戏交易平台信息管理系统的设计与实现(源码+lw+部署文档+讲解等)
基于Java的网络游戏交易平台信息管理系统的设计与实现(源码+lw+部署文档+讲解等)
26 1