HTTP长连接和短连接 + Websocket
HTTP协议与TCP/IP协议的关系
HTTP的长连接和短连接本质上是TCP长连接和短连接。HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议。IP协议主要解决网络路由和寻址问题,TCP协议主要解决如何在IP层之上可靠的传递数据包,使在网络上的另一端收到发端发出的所有包,并且顺序与发出顺序一致。TCP有可靠,面向连接的特点。
长连接短连接操作过程
短连接的操作步骤是:
建立连接——数据传输——关闭连接…建立连接——数据传输——关闭连接
长连接的操作步骤是:
建立连接——数据传输 …(保持连接)… 数据传输——关闭连接
长连接和短连接的优点和缺点
长连接可以省去较多的TCP建立和关闭的操作,减少浪费,节约时间。但是如果连接数比较多,会给服务器造成比较大压力。
短连接对于服务器来说管理较为简单,存在的连接都是有用的连接,不需要额外的控制手段。但如果客户请求频繁,将在TCP的建立和关闭操作上浪费时间和带宽。
什么时候用长连接,短连接
长连接多用于操作频繁,点对点的通讯,而且连接数不能太多情况。例如:数据库的连接用长连接, 如果用短连接频繁的通信会造成socket错误,而且频繁的socket 创建也是对资源的浪费。
而像WEB网站的http服务一般都用短链接,因为长连接对于服务端来说会耗费一定的资源,而像WEB网站这么频繁的成千上万甚至上亿客户端的连接用短连接会更省一些资源,如果用长连接,而且同时有成千上万的用户,如果每个用户都占用一个连接的话,那可想而知吧。所以并发量大,但每个用户无需频繁操作情况下需用短连好。
推送服务
推送技术,又名反向AJAX,指的是一种基于Internet,将由中心或发布者发出消息传输给用户的技术。与之相对的是拉取(参见AJAX),这种情况下请求是由用户或客户端主动发起的。
所有的推送功能都是基于长连接的基础上的。
维护任何一个长连接都需要心跳机制,客户端发送一个心跳给服务器,服务器给客户端一个心跳应答,这样就形成客户端服务器的一次完整的握手,这个握手是让双方都知道他们之间的连接是没有断开,客户端是在线的。如果超过一个时间的阈值,客户端没有收到服务器的应答,或者服务器没有收到客户端的心跳,那么对客户端来说则断开与服务器的连接重新建立一个连接,对服务器来说只要断开这个连接即可。
在智能手机上的长连接心跳和在Internet上的长连接心跳有什么不同的目的呢?原因就在于智能手机使用的是移动无线网络,那么我们在讲长连接之前我们首先要了解无线移动网络的特点。
简单来说就是由于网络运营商为了节省信道资源,会在一台移动终端一段时间没有通信时关闭其关的链路。为了应对这种情况,移动应用不得不以远高于正常频率来发送心跳用以维护推送的长连接。
Android系统的推送和iOS的推送
ios长连接是由系统来维护的,iOS上的所有应用上的推送都是先将消息推送到苹果的服务器然后将苹果服务器通过这个系统级别的长链接推送到手机终端上,这样做的好处是:
- 在手机终端始终只要维护一个长连接即可,而且由于这个长链接是系统级别的不会出现被杀死而无法推送的情况。
- 省电,不会出现每个应用都各自维护一个自己的长连接。
- 安全,只有在苹果注册的开发者才能够进行推送,等等。
Android的长连接是由每个应用各自维护的,而谷歌退出的和苹果类似的推送框架在国内无法使用的。
推送的常见方式
- 轮询(polling)
- 持久链接(binding)
- SMS方式
WebSocket
WebSocket API是下一代客户端-服务器的异步通信方法。该通信取代了单个的TCP套接字,使用ws或wss协议,可用于任意的客户端和服务器程序。
WebSocket API最伟大之处在于服务器和客户端可以在给定的时间范围内的任意时刻,相互推送信息。WebSocket并不限于以Ajax(或XHR)方式通信,因为Ajax技术需要客户端发起请求,而WebSocket服务器和客户端可以彼此相互推送信息;XHR受到域的限制,而WebSocket允许跨域通信。
WebSocket的客户端API
// 创建一个Socket实例,ws表示WebSocket协议
var socket = new WebSocket('ws://localhost:8080');
// 打开socket
socket.onopen = function(event){
// 发送一个初始化消息
socket.send('hello socket')
// 监听消息
socket.onmessage = function(event){
console.log('client reveived a meessage', event)
}
// 监听Socket的关闭
socket.oncolse = function(event){
console.log('Client notified socket has closed', event)
}
// 关闭Socket
socket.closd()
}
一个模拟聊天室websocket的例子:
在实际应用中,socket服务器端的代码可以是Python,node.js,java,php。在这里使用http://www.websocket.org/网站提供的,socket
服务端。协议地址为:ws://echo.websocket.org/
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Websocket</title>
<style>
* {
margin: 0;
padding: 0;
}
#outer {
box-sizing: border-box;
width: 60%;
height: 400px;
padding: 20px 200px;
background: black;
font-size: 20px;
color: #F8F8F8;
overflow-y: auto;
}
#message {
width: 300px;
height: 20px;
margin-top: 10px;
margin-left: 100px;
margin-right: 50px;
}
p {
margin: 10px 0;
}
button {
background: none;
outline: none;
border: 1px solid #0b9ce1;
padding: 5px 15px;
margin: 0 8px;
border-radius: 5px;
}
</style>
</head>
<body>
<div id="outer">
<p>123</p>
<p>123</p>
</div>
<label><input id="message"></label>
<button id="send">发送</button>
<button id="quite">断开</button>
</body>
<script src="../lib/jquery.min.js"></script>
<script>
function log(msg) {
$('#outer').append('<p>' + msg + '</p>').scrollTop(500)
}
function send() {
var text = $('#message').val();
if (!text) {
alert('Message can not be empty!');
return;
}
try {
socket.send(text);
log('Send : ' + text);
$('#message').val('').focus()
}
catch (e) {
log(e)
}
}
function quit() {
log("Bye!");
socket.close();
socket = null;
}
var socket = null;
function init() {
//声明host注意:是ws协议
var host = "ws://echo.websocket.org/";
try {
//新创建一个socket对象
socket = new WebSocket(host);
//将连接的状态信息显示在log
log('WebSocket - status ' + socket.readyState);
//监听打开连接
socket.onopen = function (msg) {
log("Welcome - status " + this.readyState);
};
//监听当接收信息时触发匿名函数
socket.onmessage = function (msg) {
log("Received : " + msg.data);
};
//关闭连接
socket.onclose = function (msg) {
log("Disconnected - status " + this.readyState);
};
}
catch (e) {
log(ex)
}
$('#message').focus();
}
$(function () {
init();
$("#message").keypress(function (e) {
if (event.keyCode === 13) {
send();
}
});
$('#send').click(function () {
send();
});
$('#quite').click(function () {
quite();
});
$("#outer").scroll(function(){
$(this)
})
})
</script>
</html>
更多关于socket io等的例子和方案看这里。
参考
- http://blog.csdn.net/freewaywalker/article/details/50067757
- http://www.cnblogs.com/wei2yi/archive/2011/03/23/1992830.html
- http://blog.csdn.net/frank_good/article/details/50856585
- http://school.youth.cn/px/lamp/2013/0125/39793.shtml
HTTP长连接和短连接 + Websocket的更多相关文章
- 长连接、短连接、长轮询和WebSocket
//转发,格式待整理 2017-08-0519784View0 对这四个概念不太清楚,今天专门搜索了解一下,总结一下: 长连接:在HTTP 1.1,客户端发出请求,服务端接收请求,双方建立连接,在服务 ...
- HTTP的长连接和短连接——Node上的测试
本文主要从实践角度介绍长.短连接在TCP层面的表现,借助Node.JS搭建后台服务,使用WinHTTP.Ajax做客户端请求测试,最后简单涉及WebSocket. 关键字:长连接.短连 ...
- TCP同步与异步,长连接与短连接【转载】
原文地址:TCP同步与异步,长连接与短连接作者:1984346023 [转载说明:http://zjj1211.blog.51cto.com/1812544/373896 这是今天看到的一篇讲到T ...
- HTTP的长连接和短连接
本文总结&分享网络编程中涉及的长连接.短连接概念. 关键字:Keep-Alive,并发连接数限制,TCP,HTTP 一.什么是长连接 HTTP1.1规定了默认保持长连接(HTT ...
- (转)HTTP 长连接和短连接
1. HTTP协议与TCP/IP协议的关系 HTTP的长连接和短连接本质上是TCP长连接和短连接.HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议.IP协议主要解决网络路由和寻址问 ...
- HTTP长连接和短连接
1.HTTP协议的五大特点1)支持客户/服务器模式2)简单快速3)灵活4)无连接每次连接只处理一个请求,服务器处理完客户的请求,并受到客户的应答后,断开连接.5)无状态协议不会记录服务器客户端状态. ...
- 误人子弟的网络,谈谈HTTP协议中的短轮询、长轮询、长连接和短连接
引言 最近刚到公司不到一个月,正处于熟悉项目和源码的阶段,因此最近经常会看一些源码.在研究一个项目的时候,源码里面用到了HTTP的长轮询.由于之前没太接触过,因此LZ便趁着这个机会,好好了解了一下HT ...
- Http 和TCP的关系,TCP长连接和短连接有什么区别?
HTTP 协议即超文本传送协议(Hypertext Transfer Protocol ),是Web联网的基础,也是手机联网常用的协议之一,HTTP协议是建立在TCP协议之上的一种应用.由于HTTP在 ...
- 【转】HTTP中的长连接和短连接分析
1. HTTP协议与TCP/IP协议的关系 HTTP的长连接和短连接本质上是TCP长连接和短连接.HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议.IP协议主要解决网络路由和寻址问 ...
随机推荐
- 高可用Redis(五):瑞士军刀之慢查询,Pipeline和发布订阅
1.慢查询 1.1 慢查询的生命周期 步骤一:client通过网络向Redis发送一条命令 步骤二:由于Redis是单线程应用,可以把Redis想像成一个队列,client执行的所有命令都在排队等着s ...
- Xamarin Layout属性(转)
第一类:属性值 true或者 false android:layout_centerHrizontal 水平居中 android:layout_centerVertical 垂直居中 android: ...
- OpenStack--glance组件镜像服务
glance介绍 Glance 是 OpenStack 项目中负责镜像管理的模块,其功能包括虚拟机镜像的查找,注册和检索等.Glance 提供 Restful API 可以查询虚拟机镜像的 metad ...
- 模拟实现库函数的atoi、atof和itoa
1.函数atoi atoi (表示 alphanumeric to integer)是把字符串转换成整型数的一个函数.广泛的应用在计算机程序和办公软件中.atoi( ) 函数会扫描参数 nptr字符串 ...
- spring boot 集成axis1.4 java.lang.NoClassDefFoundError: Could not initialize class org.apache.axis.client.AxisClient
pom配置: <dependencies> <dependency> <groupId>org.springframework.boot</groupId&g ...
- Java练习2
1 编写一个应用程序,模拟机动车的加速和减速功能.机动车类Vehicle的UML图如下,其中speedUp()方法实现加速功能,速度上限为240 km/h:speedDown()实现降速功能,下限为0 ...
- Jmeter3.2源码编译环境搭建
1.下载jmeter3.2源码 https://github.com/apache/jmeter/tree/v3_2 https://blog.csdn.net/fly_to_higher/artic ...
- 20175305张天钰《java程序设计》第七周学习总结
<java程序设计>第七周学习总结 第八章 常用实用类 1.String类 1.String类不可以有子类. 2.用户无法输出String对象的引用,输出的是字符序列 3.构造方法:Str ...
- 网络攻击技术:SQL Injection(sql注入)
网络攻击技术开篇——SQL Injection 1.1.1 摘要 日前,国内最大的程序员社区CSDN网站的用户数据库被黑客公开发布,600万用户的登录名及密码被公开泄露,随后又有多家网站的用户密码 ...
- [enum]enum的用法
ENUM概况 enum枚举类型是C/C++中的一种数据类型,与struct和class一样是用户自定义的类型,其特点在于enum类型的变量取值是有限的,是可以一一列举出来的. ENUM定义 C++ e ...