如何区分HTTP协议的无状态和长连接?HTTP是无状态的
也就是说,浏览器和服务器每进行一次HTTP操作 , 就建立一次连接,但任务结束就中断连接 。如果客户端浏览器访问的某个HTML或其他类型的 Web页中包含有其他的Web资源,如JavaScript文件、图像文件、CSS文件等;当浏览器每遇到这样一个Web资源,就会建立一个HTTP会话
HTTP1.1和HTTP1.0相比较而言,最大的区别就是增加了持久连接支持(貌似最新的 http1.0 可以显示的指定 keep-alive),但还是无状态的,或者说是不可以信任的 。
如果浏览器或者服务器在其头信息加入了这行代码
Connection:keep-alive
TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求 。保持连接节省了为每个请求建立新连接所需的时间,还节约了带宽 。
实现长连接要客户端和服务端都支持长连接 。
所谓长连接指建立SOCKET连接后不管是否使用都保持连接,但安全性较差,
所谓短连接指建立SOCKET连接后发送后接收完数据后马上断开连接 , 一般银行都使用短连接
短连接:比如
http
的 , 只是连接、请求、关闭 , 过程时间较短
,
服务器若是一段时间内没有收到请求即可关
闭连接 。
长连接:有些服务需要长时间连接到服务器,比如
CMPP
,一般需要自己做在线维持 。
最近在看
“
服务器推送技术
”
,在
B/S
结构中,通过某种
magic
使得客户端不需要通过轮询即可以得到服务
端的最新信息(比如股票价格)
,这样可
以节省大量的带宽 。
传统的轮询技术对服务器的压力很大,
并且造成带宽的极大浪费 。如果改用
ajax
轮询,可以降低带宽的负荷
(因为服务器返回的不是完整页面)
,
但是对服务器
的压力并不会有明显的减少 。
而推技术(
push
)可以改善这种情况 。但因为
HTTP
连接
的特性(短暂,必须由客户端发起)
,使得推技术的实现比较困难,常见的做法是通过延长
http
连接的寿
命
,
来实现
push
。
接下来自然该讨论如何延长
http
连接的寿命
,
最简单的自然是死循环法
:
【
servlet
代
码
片
段
】
public
void
doGet(Request
【包含go语言中http长连接的词条】req,
Response
res)
{
PrintWriter
out
=
res.getWriter();
……
正
常
输
出
页
面
……
out.flush();
while
(true)
{
out.print("
输
出
更
新
的
内
容
");
out.flush();
Thread.sleep(3000);
}
}
如果使用观察者模式则可以进一
步提高性能 。
但是这种做法的缺点在于客户端请求了这个
servlet
后,
web
服务器会开启一个线程执行
servlet
的代码,而
servlet
由迟迟不肯结束,造成
该线程也无法被释放 。于是乎,一个客户端一个线程,
当客户端数量增加时 , 服务器依然会承受很大的负担 。
要从根本上改变这个现象比较复杂,目前的趋
势是从
web
服务器内部入手,用
nio
(
JDK
1.4
提出的
java.nio
包)改写
request/response
推荐阅读
- 半无人直播间效果,无人直播啥意思
- jquery数据移除数据,jquery移除属性
- html5版面设计,html设计模板
- 忍者动作游戏系列游戏,忍者动作手游
- 关于vb.net开发记事本的信息
- 怎么扩大字体苹果手机软件,iphone怎么设置字体
- 邵阳学新媒体如何选择,学新媒体报什么专业
- mysql表太大怎么分表 mysql大表分区
- oracle查询序列最大数,oracle如何查询序列