WebSocket和Socket

WebSocket和Socket

tags:WebSocket和Socket


引言:好多朋友想知道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。

由于展开来讲的话篇幅太长,大家也可以自行深入了解。

上一篇:Maven修改镜像仓库地址


下一篇:gdb命令中查看地址之x命令