JAVA 网络长短连接
作为java的刚開始学习的人,看了网上的资料后,关于java的长短连接,感觉理解的不是非常深刻。结合自己的学习和网上的资料整理例如以下。不对之处请大家批评指正。
事实上作为java语言本身而言,可以提供给我们使用的终于的网络接口实际也就是java的Socket API。除此外别无他物。 所以我们常常提到的HTTP和Netty 长短连接实际都是针对的java Socket而言的,大家都学过网络的7层模型,可是在JAVA中7层模型显的过于的复杂,大多数的层。我们无法直接感知。
实际简化为例如以下的图是较为准确的:
HTTP的长短连接:
何为HTTP长连接,准确的说HTTP是无状态的连接,每一次请求完毕后。实际client和server端在应用层是没有不论什么连接的,也就是所谓的每一次请求建立一次连接,无状态的,可是为什么还有HTTP长连接之说呢?那是由于HTTP作为应用层的协议事实上际依赖的是底层的TCP协议,TCP协议大家都很的熟悉也就是三次握手的可靠连接,能够多次可靠的传递IP数据包。所以在HTTP的协议中,有一个属性是:Connection:keep-alive。设置了该属性则是浏览器告诉server请使用HTTP长连接方式,实际也就是TCP长连接,也就是浏览器实际和server之间在完毕一次HTTP请求后并没有真正的关闭底层Socket连接,下一次的请求还是继续的使用这个连接。
以Tomcat为样例,实际Tomcat 在HTPP长连接方式下。当一个新的HTTP请求来临则打开一个Socket处理请求完成后,TOMCAT并没有马上调用java 关闭Socket的方法关闭连接,而是维持了这个连接,当然此时假设浏览器关闭了,那这个TCP链路也就关闭了(关于怎样维持一个TCP连接不中断,这个超出的本文的讨论范围,仅仅须要记住仅仅要没有显式去关闭已创建的Socket连接,则保持着TCP的连接)。大家知道网络资源也是非常珍贵的。所以Tomcat不能一直维持着这个连接。当上次请求时间大于用户设置的Session
有效时间到来时,则会主动关闭这个连接。这个时间是能够设置的。
当然也能够不设置这个字段,那实际就是告诉server,请每次创建连接,一次请求后则直接关闭,这样的情况是相当的耗费资源的。实际也就是HTTP的短连接。Tomcat等都是默认的TCP长连接。
JAVA NIO的长短连接:
JAVA的NIO 大家都很的熟悉了。基于NIO的netty等传输协议也是很的多,这些框架都号称实现了长连接,实际其依赖的网络底层依然是java的Socket 接口。事实上也就是在传输的过程中,java的Socket并没有随着传输数据的完毕而关闭,而是一直维持着这个TCP的连接,等下次使用依然使用这个连接(同上。关于怎样维持TCP的长连接超出的本文的讨论范围)。而以netty为样例,是支持用户指定初始化方式的,即类似于HTTP。能够设置是使用长连接还是短连接。在netty的服务端和client均能够设置一个參数: bootstrap.setOption("child.keepAlive", true); 就是告诉netty在传输数据完毕后。不要马上关闭底层的连接。
附:
关于底层是怎样维持TCP长连接的。能够參考《TCP/IP具体解释》一书。有具体的介绍。
总之就是server和client之间建立一个探測心跳,不断的侦断对方是否依然存在,假设没有收到对方的反馈信息,能够觉得对方的连接已经断了,那么server会考虑关闭TCP连接,假设对方在一定的时间又发送了侦断信息。则觉得又连接上了。
总之,通过TCP的长连接,维持了一个相应用层透明的链路,应用层能够重复的使用这个链路数据传输,而保存高效,避免了三次握手建立连接和四次握手关闭连接所带来的资源浪费和资源消耗。
JAVA 网络长短连接的更多相关文章
- Java网络连接之HttpURLConnection、HttpsURLConnection
工具类包含两个方法: http请求.https请求 直接看代码: package com.jtools; import java.io.BufferedReader; import java.io.I ...
- Android开发之java代码工具类。判断当前网络是否连接并请求下载图片
package cc.jiusan.www.utils; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; ...
- 20145205 《Java程序设计》实验报告五:Java网络编程及安全
20145205 <Java程序设计>实验报告五:Java网络编程及安全 实验要求 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.客户端中输入明文,利用DES算法加密,D ...
- Java 网络编程学习总结
新手一枚,Java学习中,把自己学习网络编程的知识总结一下,梳理下知识,方便日后查阅,高手莫进. 本文的主要内容: [1] 网络编程认识 [2] TCP/IP编程 ...
- Java 网络爬虫获取网页源代码原理及实现
Java 网络爬虫获取网页源代码原理及实现 1.网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成.传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL ...
- 20145212 实验五《Java网络编程》
20145212 实验五<Java网络编程> 一.实验内容 1.运行下载的TCP代码,结对进行,一人服务器,一人客户端: 2.利用加解密代码包,编译运行代码,一人加密,一人解密: 3.集成 ...
- Java网络编程学习
服务器是指提供信息的计算机或程序,客户机是指请求信息的计算机或程序,而网络用于连接服务器与客户机,实现两者相互通信.但有时在某个网络中很难将服务器与客户机区分开.我们通常所说的“局域网”(Local ...
- 20145213《Java程序设计》实验五Java网络编程及安全
20145213<Java程序设计>实验五Java网络编程及安全 实验内容 1.掌握Socket程序的编写. 2.掌握密码技术的使用. 3.设计安全传输系统. 实验预期 1.客户端与服务器 ...
- 20145206《Java程序设计》实验五Java网络编程及安全
20145206<Java程序设计>实验五 Java网络编程及安全 实验内容 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.设计安全传输系统. 实验步骤 我和201451 ...
随机推荐
- 93. [NOIP2001] 数的划分
问题描述 将整数n分成k份,且每份不能为空,任意两种方案不能相同(不考虑顺序). 例如:n=7,k=3,下面三种分法被认为是相同的. 1,1,5; 1,5,1; 5,1,1; 问有多少种不同的分法. ...
- Spark学习之RDD编程(2)
Spark学习之RDD编程(2) 1. Spark中的RDD是一个不可变的分布式对象集合. 2. 在Spark中数据的操作不外乎创建RDD.转化已有的RDD以及调用RDD操作进行求值. 3. 创建RD ...
- oracle dos命令
1.无账户密码登录数据库:sqlplus/nolog 后面不能加分号,否则不能识别 2.登录数据库:sqlplus 3.在sql下测试连接性:conn oracle_name/oracle_passw ...
- 个人软件过程(psp)需求分析
个人软件过程(psp)需求分析 1. 引言 1.1 背景 开发项目进度计划不准确,延期经常出现,甚至无法给出一个比较准确的延迟时间,给市场推广带来很大麻烦. 2. 任务概述 2.1 目标 PSP ...
- ThinkPHP---TP功能类之验证码
[一]验证码 验证码全称:captcha(全自动识别机器与人类的图灵测试),简单理解就是区分当前操作是人执行的还是机器执行的 常见验证码分3种:页面上图片形式.短信验证码(邮箱验证可以归类到短信验证码 ...
- SSH命令行传输文件到远程服务器
Ubuntu操作系统 SCP命令 使用方式如下: 1.上传本地文件到远程服务器 scp /var/www/test.php root@192.168.0.101:/var/www/ 把本机/var/w ...
- CentOS下安装微软雅黑字体
CentOS下安装微软雅黑字体 微软雅黑下载地址:http://download.csdn.net/detail/u012547633/9796219 1.先从你本机 C:\Windows\Fon ...
- BeanFactory和ApplicationContext
BeanFactory是一个类的通用工厂,可以创建并管理各种类的对象 Bean工厂是Spring框架最核心的接口,它提供了高级Ioc的配置机制.BeanFeactory使管理不同类的Java对象成为可 ...
- HTML5定制全选列头
随着HTML5产品分支的不断深入使用,HTML5的需求也是越来越多,表格组件的使用也不例外,什么排序,分页,自动列宽等.最近有客户提出了如果让表格的列头加上全选的功能.细细分析其实就是两部分,表格的b ...
- UVA12118 Inspector's Dilemma(欧拉路径)
题目: 某个国家有V(V≤1000)个城市,每两个城市之间都有一条双向道路直接相连,长度为T(每条边的长度都是T).你的任务是找一条最短的道路(起点和终点任意), 使得该道路经过E条指定的边.输出这条 ...