基于websocket的扫码登录

扫码登录流程
启动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;
      
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值