【WebSocket学习】

概念:WebSocket协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信——允许服务器主动发送信息给客户端。WebSocket通信协议于2011年被IETF定为标准RFC 6455,并被RFC7936所补充规范。

<?php
class WebSocketServer
{
    public $ws_server;

    CONST PORT = 8090;
    CONST HOST = ‘0.0.0.0‘;
    CONST ENABLE_STATIC_HANDLER = TRUE;
    CONST DOCUMENT_ROOT = ‘/www/wwwroot/swoole‘;

    public function __construct()
    {
        $this->ws_server = new swoole_websocket_server(self::HOST, self::PORT);

        $this->ws_server->on(‘open‘, function ($ws_server, $request) {
        $this->onOpen($ws_server, $request);
        });
        $this->ws_server->on(‘message‘, function ($ws_server, $frame) {
        $this->onMessage($ws_server, $frame);
        });
        $this->ws_server->on(‘close‘, function ($request, $response) {
        $this->onClose($request, $response);
        });

        //因为webSocket继承自 swoole_http_server 所以它也可以作为httpServer
        $this->ws_server->set([
            ‘document_root‘ => self::DOCUMENT_ROOT,
            ‘enable_static_handler‘ => self::ENABLE_STATIC_HANDLER,
        ]);

        $this->ws_server->start();
    }

    //监听webSocket的连接事件
    private function onOpen($ws_server, $request)
    {
        echo "欢迎客户端 {$request->fd} 连接本服务器\n";
    }

    //监听webSocket的消息事件
    private function onMessage($ws_server, $frame)
    {
        //$frame->data,数据内容,可以是文本内容也可以是二进制数据,可以通过opcode的值来判断
        //$frame->opcode,WebSocket的OpCode类型,可以参考WebSocket协议标准文档
        //$frame->finish, 表示数据帧是否完整,一个WebSocket请求可能会分成多个数据帧进行发送(底层已经实现了自动合并数据帧,现在不用担心接收到的数据帧不完整)
        echo "客户端 {$frame->fd} 说:{$frame->data} (opcode:{$frame->opcode},finish:{$frame->finish})\n";
        $ws_server->push($frame->fd, "我是服务端,我已收到您的消息,您说的是:".$frame->data);
    }

    //监听客户端关闭连接事件
    private function onClose($ws_server, $fd)
    {
        echo "客户端 {$fd} 已关闭连接\n";
    }
}

new WebSocketServer();

启动服务:

[[email protected] swoole]# php ws_server.php

浏览器访问:

websocket和http比较:

HTTP、WebSocket 等应用层协议,都是基于 TCP 协议来传输数据的

HTTP:

1,无状态协议。

2,短连接。(Ajax轮询方式或Long  poll方式实现“持久连接”状态)

2,被动型。  客户端请求->服务器端响应。服务端不能主动联系客户端,只能有客户端发起。

WebSocket:

它解决了HTTP的这几个难题。
如被动性,当服务器完成协议升级后(HTTP->Websocket),服务端就可以主动推送信息给客户端啦。

就变成了这样,只需要经过一次HTTP请求,就可以做到源源不断的信息传送了。(在程序设计中,这种设计叫做回调,即:你有信息了再来通知我,而不是我傻乎乎的每次跑来问你)
这样的协议解决了同步有延迟,而且还非常消耗资源的这种情况。
那么为什么他会解决服务器上消耗资源的问题呢?
其实我们所用的程序是要经过两层代理的,即HTTP协议在Nginx等服务器的解析下,然后再传送给相应的Handler(PHP等)来处理。
简单地说,我们有一个非常快速的接线员(Nginx),他负责把问题转交给相应的客服(Handler)。
本身接线员基本上速度是足够的,但是每次都卡在客服(Handler)了,老有客服处理速度太慢。,导致客服不够。
Websocket就解决了这样一个难题,建立后,可以直接跟接线员建立持久连接,有信息的时候客服想办法通知接线员,然后接线员在统一转交给客户。
这样就可以解决客服处理速度过慢的问题了。

同时,在传统的方式上,要不断的建立,关闭HTTP协议,由于HTTP是非状态性的,每次都要重新传输identity info(鉴别信息),来告诉服务端你是谁。
虽然接线员很快速,但是每次都要听这么一堆,效率也会有所下降的,同时还得不断把这些信息转交给客服,不但浪费客服的处理时间,而且还会在网路传输中消耗过多的流量/时间。
但是Websocket只需要一次HTTP握手,所以说整个通讯过程是建立在一次连接/状态中,也就避免了HTTP的非状态性,服务端会一直知道你的信息,直到你关闭请求,这样就解决了接线员要反复解析HTTP协议,还要查看identity info的信息。
同时由客户主动询问,转换为服务器(推送)有信息的时候就发送(当然客户端还是等主动发送信息过来的。。),没有信息的时候就交给接线员(Nginx),不需要占用本身速度就慢的客服(Handler)了。

WebSocket 机制

以下简要介绍一下WebSocket的原理及运行机制。

WebSocket是HTML5下一种新的协议。它实现了浏览器与服务器全双工通信,能更好的节省服务器资源和带宽并达到实时通讯的目的。它与HTTP一样通过已建立的TCP连接来传输数据,但是它和HTTP最大不同是:

WebSocket是一种双向通信协议。在建立连接后,WebSocket服务器端和客户端都能主动向对方发送或接收数据,就像Socket一样;
WebSocket需要像TCP一样,先建立连接,连接成功后才能相互通信。

原文地址:https://www.cnblogs.com/fyandy/p/10057991.html

时间: 2024-10-06 21:12:51

【WebSocket学习】的相关文章

WebSocket 学习(三)--用nodejs搭建服务器

前面已经学习了WebSocket API,包括事件.方法和属性.详情:WebSocket(二)--API  WebSocket是基于事件驱动,支持全双工通信.下面通过三个简单例子体验一下. 简单开始 1.安装node.https://nodejs.org/en/ 2.安装ws模块 ws:是nodejs的一个WebSocket库,可以用来创建服务. https://github.com/websockets/ws 3.server.js 在项目里面新建一个server.js,创建服务,指定8181

python websocket学习使用

前言 今天看了一些资料,记录一下心得. websocket是html5引入的一个新特性,传统的web应用是通过http协议来提供支持,如果要实时同步传输数据,需要轮询,效率低下 websocket是类似socket通信,web端连接服务器后,握手成功,一直保持连接,可以理解为长连接,这时服务器就可以主动给客户端发送数据,实现数据的自动更新. 使用websocket需要注意浏览器和当前的版本,不同的浏览器提供的支持不一样,因此设计服务器的时候,需要考虑. 进一步简述 websocket是一个浏览器

【Todo】Websocket学习

首先是在Tomcat里面看到Websocket的演示.很有意思. http://localhost:8080/examples/websocket/index.xhtml 里面有: Echo example Chat example Multiplayer snake example Multiplayer drawboard example 都实现的非常有意思.上网一查,原来websocket是H5里面很有意思的技术.

webSocket学习

### 一.首先查了一下socket和websocket的区别 要了解,这两者的区别,最好的方法就是了解二者本身,那么区别也就不言而喻了. 原文出处: TheAlchemist 当我们探讨两件事物的区别和联系时,我们想探讨些什么? 前段时间写了两篇介绍 HTTP 和 WebSocket 的文章,回复中有人说希望了解下WebSocket和Socket的区别.这个问题之前也有想过,自己对此是有大概的答案,可是并不太确定,于是去搜集了些资料(其实就是各种Google),看了很多以前的文档,觉得有些故事

WebSocket学习笔记IE,IOS,Android等设备的兼容性问

一.背景 公司最近准备将一套产品放到Andriod和IOS上面去,为了统一应用的开发方式,决定用各平台APP嵌套一个HTML5浏览器来实现,其中数据通信,准备使用WebSocket的方式.于是,我开始在各大浏览器上测试. 二.协议分析 2.1 WebSocket的请求包 首先把原来做Socket通信的程序拿出来,跟踪下浏览器在WebSocket应用请求服务端的时候发的数据包的内容: IE11: GET /chat HTTP/1.1 Origin: http://localhost Sec-Web

WebSocket学习记录

参考资料: Java后端WebSocket的Tomcat实现 java WebSocket的实现以及Spring WebSocket 基于Java的WebSocket推送 基于GoEasy实现Java web实时数据推送 使用GoEasy实现web实时推送

Websocket 学习

一.含义 WebSocket 是一种在单个TCP连接上进行全双工通讯的协议.   WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据.在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输. 二.Websocket 产生背景 很多网站为了实现推送技术,所用的技术都是轮询. 轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP请求,然后由服务器返回最新的数据给客户端的浏览器

WebSocket学习笔记

WebSocket的优点: 1. 节约带宽. 不停地轮询服务端数据这种方式,使用的是http协议,head信息很大,有效数据占比低, 而        使用WebSocket方式,头信息很小,有效数据占比高.  2. 无浪费. 轮询方式有可能轮询10次,才碰到服务端数据更新,那么前9次都白轮询了,因为没有拿到变化     的数据. 而WebSocket是由服务器主动回发,来的都是新数据.     3. 实时性,考虑到服务器压力,使用轮询方式不可能很短的时间间隔,否则服务器压力太多,所以轮询时间

关于WebSocket学习记录(一)

WebSocket技术的理解: WebSocket是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议. WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据.在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输.在 WebSocket API 中,浏览器和服务器只需要做一个握手的动作,然后,浏览器和服务器之间就形成了一条快速通道.两者之间就直接可以数据互相传送