php使⽤websocket⽰例client和server
这篇⽂章主要介绍了php使⽤websocket⽰例,需要的朋友可以参考下
下⾯我画了⼀个图演⽰ client 和 server 之间建⽴ websocket 连接时握⼿部分,这个部分在 node 中可以⼗分轻松的完成,因为 node 提供的net 模块已经对 socket 套接字做了封装处理,开发者使⽤的时候只需要考虑数据的交互⽽不⽤处理连接的建⽴。⽽ php 没有,从 socket 的连接、建⽴、绑定、监听等,这些都需要我们⾃⼰去操作,所以有必要拿出来再说⼀说。
①和②实际上就是⼀个 HTTP 的请求和响应,只不过我们在处理的过程中我们拿到的是没有经过解析的字符串。如:
代码如下:
GET /chat HTTP/1.1
Host: ample
Origin:
我们往常看到的请求是这个样⼦,当这东西到了服务器端,我们可以通过⼀些代码库直接拿到这些信息。
⼀、php 中处理 websocket
WebSocket 连接是由客户端主动发起的,所以⼀切要从客户端出发。第⼀步是要解析拿到客户端发过来的 Sec-WebSocket-Key 字符串。
代码如下:
GET /chat HTTP/1.1
Host: ample
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==
Origin:
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
client 请求的格式
⾸先 php 建⽴⼀个 socket 连接,监听端⼝的信息。
1. socket 连接的建⽴
关于 socket 套接字的建⽴,相信很多⼤学修过计算机⽹络的⼈都知道了,下⾯是⼀张连接建⽴的过程:
代码如下:
// 建⽴⼀个 socket 套接字
$master = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_option($master, SOL_SOCKET, SO_REUSEADDR, 1);
socket_bind($master, $address, $port);
socket_listen($master);
相⽐ node,这个地⽅的处理实在是太⿇烦了,上⾯⼏⾏代码并未建⽴连接,只不过这些代码是建⽴⼀个 socket 套接字必须要写的东西。由于处理过程稍微有复杂,所以我把各种处理写进了⼀个类中,⽅便管理和调⽤。
代码如下:
//demo.php
Class WS {
var $master;  // 连接 server 的 client
var $sockets = array(); // 不同状态的 socket 管理
var $handshake = false; // 判断是否握⼿
function __construct($address, $port){
// 建⽴⼀个 socket 套接字
$this->master = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)
or die("socket_create() failed");
socket_set_option($this->master, SOL_SOCKET, SO_REUSEADDR, 1)
or die("socket_option() failed");
socket_bind($this->master, $address, $port)
or die("socket_bind() failed");
socket_listen($this->master, 2)
or die("socket_listen() failed");
$this->sockets[] = $this->master;
// debug
echo("Master socket  : ".$this->master."\n");
while(true) {
//⾃动选择来消息的 socket 如果是握⼿⾃动选择主机            $write = NULL;
$except = NULL;
socket_select($this->sockets, $write, $except, NULL);
foreach ($this->sockets as $socket) {
//连接主机的 client
if ($socket == $this->master){
$client = socket_accept($this->master);
if ($client < 0) {
// debug
echo "socket_accept() failed";
continue;
} else {
//connect($client);
array_push($this->sockets, $client);
echo "connect client\n";
}
} else {
$bytes = @socket_recv($socket,$buffer,2048,0);                    if($bytes == 0) return;
if (!$this->handshake) {
// 如果没有握⼿,先握⼿回应
/
/doHandShake($socket, $buffer);
echo "shakeHands\n";
} else {
// 如果已经握⼿,直接接受数据,并处理                        $buffer = decode($buffer);
//process($socket, $buffer);
echo "send file\n";
}
}
}
}websocket和socket
}
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。