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


目录
相关文章
|
5月前
|
JSON 移动开发 网络协议
Java网络编程:Socket通信与HTTP客户端
本文全面讲解Java网络编程,涵盖TCP与UDP协议区别、Socket编程、HTTP客户端开发及实战案例,助你掌握实时通信、文件传输、聊天应用等场景,附性能优化与面试高频问题解析。
|
3月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
244 1
|
3月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
260 1
|
4月前
|
SQL Java 关系型数据库
Java连接MySQL数据库环境设置指南
请注意,在实际部署时应该避免将敏感信息(如用户名和密码)硬编码在源码文件里面;应该使用配置文件或者环境变量等更为安全可靠地方式管理这些信息。此外,在处理大量数据时考虑使用PreparedStatement而不是Statement可以提高性能并防止SQL注入攻击;同时也要注意正确处理异常情况,并且确保所有打开过得资源都被正确关闭释放掉以防止内存泄漏等问题发生。
207 13
|
11月前
|
编解码 异构计算
RT-DETR改进策略【Neck】| BiFPN:双向特征金字塔网络-跨尺度连接和加权特征融合
RT-DETR改进策略【Neck】| BiFPN:双向特征金字塔网络-跨尺度连接和加权特征融合
878 10
RT-DETR改进策略【Neck】| BiFPN:双向特征金字塔网络-跨尺度连接和加权特征融合
|
3月前
|
机器学习/深度学习 分布式计算 Java
Java与图神经网络:构建企业级知识图谱与智能推理系统
图神经网络(GNN)作为处理非欧几里得数据的前沿技术,正成为企业知识管理和智能推理的核心引擎。本文深入探讨如何在Java生态中构建基于GNN的知识图谱系统,涵盖从图数据建模、GNN模型集成、分布式图计算到实时推理的全流程。通过具体的代码实现和架构设计,展示如何将先进的图神经网络技术融入传统Java企业应用,为构建下一代智能决策系统提供完整解决方案。
445 0
|
5月前
|
Windows
电脑显示有问题,电脑连接不上网络,电脑没声音,电脑链接不上打印机?驱动人生就能解决所有问题
电脑显示有问题,电脑连接不上网络,电脑没声音,电脑链接不上打印机?驱动人生就能解决所有问题
143 0
|
10月前
|
存储 网络协议 安全
Java网络编程,多线程,IO流综合小项目一一ChatBoxes
**项目介绍**:本项目实现了一个基于TCP协议的C/S架构控制台聊天室,支持局域网内多客户端同时聊天。用户需注册并登录,用户名唯一,密码格式为字母开头加纯数字。登录后可实时聊天,服务端负责验证用户信息并转发消息。 **项目亮点**: - **C/S架构**:客户端与服务端通过TCP连接通信。 - **多线程**:采用多线程处理多个客户端的并发请求,确保实时交互。 - **IO流**:使用BufferedReader和BufferedWriter进行数据传输,确保高效稳定的通信。 - **线程安全**:通过同步代码块和锁机制保证共享数据的安全性。
482 23
|
11月前
|
计算机视觉
RT-DETR改进策略【Neck】| GFPN 超越BiFPN 通过跳层连接和跨尺度连接改进RT-DETR颈部网络
RT-DETR改进策略【Neck】| GFPN 超越BiFPN 通过跳层连接和跨尺度连接改进RT-DETR颈部网络
458 12
RT-DETR改进策略【Neck】| GFPN 超越BiFPN 通过跳层连接和跨尺度连接改进RT-DETR颈部网络
|
11月前
|
计算机视觉
YOLOv11改进策略【Neck】| GFPN 超越BiFPN 通过跳层连接和跨尺度连接改进v11颈部网络
YOLOv11改进策略【Neck】| GFPN 超越BiFPN 通过跳层连接和跨尺度连接改进v11颈部网络
2450 10
YOLOv11改进策略【Neck】| GFPN 超越BiFPN 通过跳层连接和跨尺度连接改进v11颈部网络