扫码登录流程
启动socket服务端代码
1,用户访问页面,生成一个随机的uid,并且将uid跟手机端访问页面链接绑定到一起,然后生成一个二维码,连接socket服务器,等待socket服务器信息
2,用户扫码,进入手机端页面,开始进行登录操作,登录成功之后,将uid跟用户进行绑定,连接socket服务器,并向socket服务器发送uid,发送完成后断开连接
3,socket服务器收到uid后,获取uid绑定的用户信息,并且向所有pc端发送uid跟用户信息,同时断开与移动端的连接。
4,pc端收到信息后,跟生成uid进行对比,如果一致,说明用户登录成功,并向服务器返回登陆成功信息
5,服务器收到登陆成功信息后断开与pc端的连接
server.php 服务端
login.php pc端
sign.php 移动端
config.php 配置文件,socket地址跟端口
同时还需要有一个生成二维码的类库,php或者jq都可以,我这里使用phpqrcode这个类库
以上就是websocket扫码登陆流程,下面上代码
server.php
socket服务端,跟之前博客写的差不多
<?php
set_time_limit(0);
class server{
private $host = 'localhost';
private $port = 8080;
private $maxuser = 10;
public $accept = array();//所有客户端
private $cycle = array(); //循环连接池
private $isHand = array();//握手信息
public $pcAccept = array(); //连接的pc端
function __construct($host='', $port='', $max='') {
if(!empty($host)) $this->host = $host;
if(!empty($port)) $this->port = $port;
if(!empty($maxuser)) $this->maxuser = $max;
}
public function start() {
//挂起socket服务端
$this->socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_option($this->socket, SOL_SOCKET, SO_REUSEADDR, TRUE);
socket_bind($this->socket, $this->host, $this->port);
socket_listen($this->socket, $this->maxuser);
while(TRUE) {
//获取所有socket连接
$this->cycle = $this->accept;
$this->cycle[] = $this->socket;
//阻塞用,有新连接时才会结束
socket_select($this->cycle, $write, $except, null);
//遍历循环池
foreach ($this->cycle as $k => $v) {
//添加连接
if($v === $this->socket) {
if (($accept = socket_accept($v)) < 0) {
continue;
}
$this->add($accept);
continue;
}
//阻塞已断开连接
$acceptId = array_search($v, $this->accept);
if ($acceptId === NULL) {
continue;
}
//没消息的socket就断开
if (!@socket_recv($v, $data, 1024, 0) || !$data) {
$this->close($v);
continue;
}
//判断是否需要握手
if(preg_match("/Sec-WebSocket-Key: (.*)\r\n/",$data,$match)){
//进行握手
if (!$this->isHand[$acceptId]) {
$this->upgrade($v, $match[1], $acceptId);
continue;