WebSocket和Socket
WebSocket和Socket
tags:WebSocket和Socket
引言:好多朋友想知道WebSocket和Socket的联系和区别,下面应该就是你们想要的
先来一张之前收集的图,我看到这张图真的是笑了,当时还给我朋友门转发了一下,不知道你笑了没有。
联系
看完上面的图,应该猜到了,他们之间也确实没有什么实质性的联系,当然除了名字有点相同,文章后面有名称的由来可以参考阅读
Socket
英文socket的意思是插座,网络中的Socket是一个抽象的接口,可以理解为网络中连接的两端。通常被叫做套接字接口,其意义在对传输层进行封装屏蔽了传输层的复杂性。它并不是一个协议,是为了大家更方便的使用传输层协议产生的一个抽象层。大部分的主流编程语言都提供socket函数。我们拿php来举例说明
<?php
1. socket_create() - 创建一个套接字
2. socket_accept() - Accepts a connection on a socket (接收)
3. socket_bind() - 给套接字绑定IP和端口号
4. socket_connect() - 和一个套接字建立连接
5. socket_listen() - Listens for a connection on a socket (监听)
6. socket_last_error() - Returns the last error on the socket
7. socket_strerror() - Return a string describing a socket error
?>
我们可以用这些函数来建立连接实现通信功能。关于Socket我们就说这些
WebSocket
说道WebSocket了解过一些的人可能会觉得有些高大上的感觉,它的诞生还有些故事可以讲,大概是在为w3c放弃了html后,还有那么一群人不服气(不想放弃),想要继续推动html发展,同时他们也发展了一些其他的网络标准,并且被官方接收。而WebSocket就是其中一种,是为了创建一种双向通信(全双工)的协议,来作为HTTP协议的一个替代者,以解决基于http上的长轮询等技术解决不了(或者解决的不那么优美)的问题。而且这厮一开始并不叫WebSocket,好像是叫webConnect之类的,最后是一位工程师提议说要么咱们叫WebSocket吧,然后。。。。。,好了故事就这样,他既然是HTTP的替代者,我们首先看一下它和HTTP(或者HTTP的长连接)的联系和区别。
WebSocket和HTTP 1.1的联系
首先两者都是应用层协议,而且 WebSocket 在建立连接时,需要借用 http 的 101 switch protocol 来达到协议转换,为了建立一个 WebSocket 连接,客户端浏览器首先要向服务器发起一个HTTP请求,这个请求和通常的HTTP请求不同,包含了一些附加头信息,其中附加头信息"Upgrade: WebSocket"和"Connection: Upgrade"表明这是一个申请协议升级的 HTTP 请求,服务器端解析这些附加的头信息然后产生应答信息返回给客户端,客户端和服务器端的 WebSocket 连接就建立起来了,在建立连接后,就和HTTP没有关系了,双方就可以通过这个连接通道自由的传递信息。
当然,也有可能服务器不支持WebSocket,那就老老实实的用http吧,目前大部分浏览器和服务器都已支持WebSocket。
贴一段简单WebSocket客户端的js代码
<script type="text/javascript">
//语法 var Socket = new WebSocket(url, [protocol] );
var ws = new WebSocket("ws://localhost:6688/send");
//连接建立时触发
ws.onopen = function(evt) {
console.log("Connection open ...");
ws.send("Hello WebSockets!");
};
//接收消息时触发
ws.onmessage = function(evt) {
console.log("Received Message: " + evt.data);
ws.close();
};
//关闭连接触发
ws.onclose = function(evt) {
console.log("Connection closed.");
};
//通信发生错误时触发
ws.onerror = function(evt) {
console.log("Connection Error.");
};
//检查浏览器是否支持WebSocket
if(typeof WebSocket != 'undefined'){
alert("您的浏览器支持 WebSocket!");
}else{
// 浏览器不支持 WebSocket
alert("您的浏览器不支持 WebSocket!");
}
</script>
WebSocket和HTTP 1.1区别
我们来看一下他的格式:
//一个WebSocket连接始于握手(handshake)
GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Origin: http://example.com
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
对上面状态进行解释:
前两行跟HTTP的Request的起始行一样,而真正在WS的握手过程中起到作用的是下面几个header域。
Upgrade:websocket
upgrade是HTTP1.1中用于定义转换协议的header域。它表示要升级(转换)到某个协议(如果服务器支持的话)。Connection:Upgrade 表示要进行升级协议
Sec-WebSocket-Key:用来发送给服务器过滤非预期的请求(比如手动填写header中的一些信息,但本身不想升级到WebSocket。这时候,由于Sec-WebSocket-Key和一些相关项被禁止手动设置,所以可以过滤掉出现非预期的情况)。
Origin:作安全使用,防止跨站攻击,浏览器一般会使用这个来标识原始域。
Sec-WebSocket-Protocol:客户端支持的子协议的列表。
Sec-WebSocket-Version:客户端支持的WS协议的版本。
//服务端应答handshake 101表示切换
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=
Sec-WebSocket-Protocol: chat
上面是报文区别,还有一些其他的特性
- WebSocket的连接必须是一个直接连接(这个我还需要仔细研究研究,还不是很透彻,如果有懂的朋友可以帮我理解理解将不胜感谢。回头我仔细研究一下通信的方式和数据帧格式)。
- WebSocket连接建立之后,通信双方都可以在任何时刻向另一方发送数据(即全双工,这是最主要的)。
- WebSocket连接建立之后,数据的传输使用帧来传递,不同于Request。
由于展开来讲的话篇幅太长,大家也可以自行深入了解。
WebSocket和Socket的更多相关文章
- AndroidAsync :异步Socket,http(client+server),websocket和socket.io的Android类库
AndroidAsync是一个用于Android应用的异步Socket,http(client+server),websocket和socket.io的类库.基于NIO,没有线程.它使用java.ni ...
- 对.Net WebSocket 和Socket的原理的思考
今早上班路上接到了一个朋友的微信信息,问我对WebSocket 是否熟悉,一楞,印象之中没有用过这个类....来到公司后,得空问了一下度娘,原来这是一个随着HTML5推出的一种新协议,意义在于能实现浏 ...
- 【WebSocket No.2】WebSocket和Socket实现聊天群发
介绍: 前面写过一篇简单的websocke实现服务端.这一篇就不在说什么基础的东西主要是来用实例说话,主要是讲一下实现单聊和群组聊天和所有群发的思路设计. 直接不懂的可以看一下上一篇简单版本再来看也行 ...
- WebSocket和Socket的区别
前段时间写了两篇介绍HTTP和WebSocket的文章,回复中有人说希望了解下WebSocket和Socket的区别.这个问题之前也有想过,自己对此是有大概的答案,可是并不太确定,于是去搜集了些资料( ...
- WebSocket 和socket 的区别
去年光棍节的时候,我写过一篇 quick-cocos2d-x 中的 socket 技术选择:LuaSocket 和 WebSocket .这篇文章介绍了我为何决定在项目中使用 LuaSocket . ...
- 网络编程WebSocket 和socket、HTTP的区别和联系
一.WebSocket 是什么? WebSocket是HTML5规范提出的一种协议:目前除了完犊子的IE浏览器,其他浏览器都基本支持.他是一种协议,万变不离其宗,也是基于TCP协议的:和HTTP协议是 ...
- WebSocket 和 Socket 的区别
WebSocket 和 Socket 的区别 英文:TheAlchemist 链接:http://www.jianshu.com/p/59b5594ffbb0 <刨根问底 HTTP 和 We ...
- (转) websocket 和 socket 剖析
Socket 与 WebSocket 本站文章除注明转载外,均为本站原创或者翻译. 本站文章欢迎各种形式的转载,但请18岁以上的转载者注明文章出处,尊重我的劳动,也尊重你的智商: 本站部分原创和翻译文 ...
- 即时通信WebSocket 和Socket.IO
WebSocket HTML5定义了WebSocket协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯. 在2008年诞生,2011年成为国际标准. 现在基本所有浏览器都已经支持了. We ...
随机推荐
- DES
本文对DES的介绍部分摘自博文DES加密算法的C++实现,具体实现则由自己完成. 另外,DES的官方文档链接见这里,在维基百科上也有比较详细的介绍.不过,DES已经被证明是不安全的(可见于RSA公司 ...
- 写一个python的服务监控程序
写一个python的服务监控程序 前言: Redhat下安装Python2.7 rhel6.4自带的是2.6, 发现有的机器是python2.4. 到python网站下载源代码,解压到Redhat上, ...
- hive使用过的基本命令
命令:完成操作 hive:进去hive show databases:显示 所有database use wizad: 使用database wizad,或者如use aso show tables: ...
- OpenGL OpenCV根据视差图重建三维信息
代码如下: // disparity_to_3d_reconstruction.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" //Huan ...
- 单片机驱动AT24C02存储芯片
AT24C02是一个2K位串行CMOS E2PROM, 内部含有256个8位字节,CATALYST公司的先进CMOS技术实质上减少了器件的功耗.AT24C02有一个8字节页写缓冲器.该器件通过IIC总 ...
- JVM学习--(二)内存模型、可见性、指令重排序
我们将根据JVM的内存模型探索java当中变量的可见性以及不同的java指令在并发时可能发生的指令重排序的情况. 内存模型 首先我们思考一下一个java线程要向另外一个线程进行通信,应该怎么做,我们再 ...
- DB2常用命令小结
PS:执行命令前需要进入DB2的账户下:su db2inst1 修改密码:更改相应的操作系统密码即可,windows上可以更改db2admin的密码,linux上更改db2inst1的密码即可,db2 ...
- WebSocket 和 Golang 实现聊天功能
http://www.open-open.com/lib/view/open1416379948711.html 这个示例应用程序展示了如何使用 WebSocket, Golang 和 jQuery ...
- 2013-9百度技术沙龙:Clouda与nodejs
Clouda 云端一体设计思路 目前的App推广由于渠道原因非常难 Clouda是用Web技术做的移动App的框架 实时在线将会启动一批新需求 线下数据线上实时化 本地存储Merge 面向数据的开发方 ...
- maven仓库添加jar架包
推荐几个好的 Maven 常用仓库网址:http://mvnrepository.com/http://search.maven.org/http://repository.sonatype.org/ ...