欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  php教程

Websocket协议之php实现

程序员文章站 2022-04-05 13:05:41
...

前面学习了HTML5中websocket的握手 协议 、打开和关闭连接等基础内容,最近用php 实现 了与浏览器websocket的双向通信。在学习概念的时候觉得看懂了的内容,真正在实践过程中还是会遇到各种问题,网上也有一些关于php的websocket的 实现 ,但是只有自己亲手

前面学习了HTML5中websocket的握手协议、打开和关闭连接等基础内容,最近用php实现了与浏览器websocket的双向通信。在学习概念的时候觉得看懂了的内容,真正在实践过程中还是会遇到各种问题,网上也有一些关于php的websocket的实现,但是只有自己亲手写过之后才知道其中的感受。其中,google有一个开源的phpwebsocket类(https://code.google.com/p/phpwebsocket/),但是从其握手过程中可以明显看出,这还是最初的websocket协议,请求头中使用了两个KEY,并非version 13(现行版本)。下面是本人实践过程,同时封装好了一个现行版本的php实现的实用的websocket类。

一、握手

1、客户端发送请求

websocket协议提供给javascript的API就是特别简洁易用。

Websocket协议之php实现View Code

先看效果,客户端和服务器端握手的结果如下:

Websocket协议之php实现

Websocket协议之php实现

2、服务器端

封装的类为WebSocket,address和port为类的属性。

(1)建立socket并监听

 1     function createSocket()
 2     {
 3         $this->master=socket_create(AF_INET, SOCK_STREAM, SOL_TCP)
 4             or die("socket_create() failed:".socket_strerror(socket_last_error()));
 5             
 6         socket_set_option($this->master, SOL_SOCKET, SO_REUSEADDR, 1)
 7             or die("socket_option() failed".socket_strerror(socket_last_error()));
 8             
 9         socket_bind($this->master, $this->address, $this->port)
10             or die("socket_bind() failed".socket_strerror(socket_last_error()));
11             
12         socket_listen($this->master,20)
13             or die("socket_listen() failed".socket_strerror(socket_last_error()));
14         
15         $this->say("Server Started : ".date('Y-m-d H:i:s'));
16         $this->say("Master socket  : ".$this->master);
17         $this->say("Listening on   : ".$this->address." port ".$this->port."\n");
18         
19     }

然后启动监听,同时要维护连接到服务器的用户的一个数组(连接池),每连接一个用户,就要push进一个,同时关闭连接后要删除相应的用户的连接。

 1     public function __construct($a, $p)
 2     {
 3         if ($a == 'localhost')
 4             $this->address = $a;
 5         else if (preg_match('/^[\d\.]*$/is', $a))
 6             $this->address = long2ip(ip2long($a));
 7         else
 8             $this->address = $p;
 9         
10         if (is_numeric($p) && intval($p) > 1024 && intval($p) )

上一篇: 类与对象基础1

下一篇: laravel_day1