广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >php 实现websocket服务
  • 341
分享到

php 实现websocket服务

websocketphp网络协议 2023-09-04 10:09:51 341人浏览 八月长安
摘要

文章目录 前言流程握手 socket_read 读到的报文内容socket_select解析客户端发送的数据客户端发送消息处理前端连接示例完整示例 前言 之前使用的都是封

文章目录

前言

之前使用的都是封装好的websocket,现在使用PHP提供的相关函数实现一个WEBSocket服务

流程

  1. 通过 socket_create 创建服务端
  2. socket_bind 绑定服务端地址
  3. socket_listen监听服务端
  4. socket_select 剔除不是正在接受消息的客户端或者不是正常状态的服务端
  5. 判断是不是正在和服务端进行握手,是的将客户端维护
  6. 遍历正在接受消息的客户端,对其接受到的内容进行处理(是断开,还是单纯的传输信息)

握手 socket_read 读到的报文内容

GET / Http/1.1Host: localhost:8084User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:104.0) Gecko/20100101 Firefox/104.0Accept: */*Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2Accept-Encoding: gzip, deflate, brSec-WebSocket-Version: 13Origin: http://localhost:8081Sec-WebSocket-Extensions: permessage-deflateSec-WebSocket-Key: hJno9ufjz22HoskdJC9wMw==Connection: keep-alive, UpgradeSec-Fetch-Dest: websocketSec-Fetch-Mode: websocketSec-Fetch-Site: same-sitePragma: no-cacheCache-Control: no-cacheUpgrade: websocket

socket_select

socket_select( r e a d ) 能将当前没有正在接受消息的客户端或者不是正常状态的服务端从 read) 能将当前没有正在接受消息的客户端或者不是正常状态的服务端从 read)能将当前没有正在接受消息的客户端或者不是正常状态的服务端从read中剔除

解析客户端发送的数据

网上拷过来的代码

function parseMessage($data){    $res = "";    $len = ord($data[1]) & 127;    if ($len === 126) {        $make = substr($data, 4, 4);        $result = substr($data, 8);    } elseif ($len === 127) {        $make = substr($data, 10, 4);        $result = substr($data, 14);    } else {        $make = substr($data, 2, 4);        $result = substr($data, 6);    }    for ($i = 0; $i < strlen($result); $i++) {        $res .= $result[$i] ^ $make[$i % 4];    }    return $res;}

客户端发送消息处理

网上拷过来的代码

function createMessage($data){    $result = [0 => '81'];    $len = strlen($data);    if ($len < 126) {        $result[1] = $len < 16 ? '0' . dechex($len) : dechex($len);    } elseif ($len < 65025) {        $str = dechex($len);        $result[1] = '7e' . str_repeat('0', 4 - strlen($str)) . $str;    } else {        $str = dechex($len);        $result[1] = '7f' . str_repeat('0', 16 - strlen($str)) . $str;    }    $result2 = "";    for ($i = 0; $i < $len; $i++) {        $result2 .= dechex(ord($data[$i]));    }    $result[2] = $result2;    $response = implode('', $result);    return pack("H*", $response);}

前端连接示例

从菜鸟教程拷过来的

DOCTYPE html><html><head>    <meta charset="utf-8">    <title>菜鸟教程(runoob.com)title>    <script type="text/javascript">        function WebSocketTest() {            if ("WebSocket" in window) {                alert("您的浏览器支持 WebSocket!");                let socketUrl = "ws://localhost:8084";                // 打开一个 web socket                var ws = new WebSocket(socketUrl);                ws.onopen = function () {                    // Web Socket 已连接上,使用 send() 方法发送数据                    ws.send("发送数据");                    alert("数据发送中...");                };                ws.onmessage = function (evt) {                    var received_msg = evt.data;                    alert("数据已接收...");                };                ws.onclose = function () {                    // 关闭 websocket                    alert("连接已关闭...");                };            } else {                // 浏览器不支持 WebSocket                alert("您的浏览器不支持 WebSocket!");            }        }    script>head><body><div id="sse">    <a href="javascript:WebSocketTest()">运行 WebSocketa>div>body>html>

完整示例

# https://www.php.net/manual/zh/function.socket-create.php# 基于tcp协议创建socket# AF_INET ipv4网络协议# SOCK_STREAM 可靠字节流# SOL_TCP tcp传输控制协议# 创建套接字$service = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);# 绑定地址socket_bind($service, "127.0.0.1", "8084") or die("不能绑定socket地址");# 监听socket_listen($service, 6);$services = [$service];while (true) {    $copyServices = $services;    if (socket_select($copyServices, $write, $except, 0) === false)        exit("error");    # 判断服务端是否还在    # 如果服务端不是正常的状态,也会被socket_select剔除    if (in_array($service, $copyServices)) {        $client = socket_accept($service);        $body = socket_read($client, 8096);        # 判断是否是第一次建立连接        # 是的话将客户端保存        if (preg_match("/Sec-WebSocket-Key: (.*)\r\n/i", $body, $match)) {            # 按照固定算法字符串对key进行加密            $key = base64_encode(sha1($match[1] . "258EAFA5-E914-47DA-95CA-C5AB0DC85B11", true));            # 拼接响应 head 头            $header = "HTTP/1.1 101 Switching Protocol" . PHP_EOL                . "Upgrade: WebSocket" . PHP_EOL                . "Connection: Upgrade" . PHP_EOL;            $header .= "WebSocket-Location: ws://127.0.0.1:8084" . PHP_EOL;            $header .= "Sec-WebSocket-Accept: " . $key . PHP_EOL . PHP_EOL;            socket_write($client, $header);            socket_write($client, createMessage("hello websocket"));            echo "建立连接" . PHP_EOL;            $services[] = $client;        }        # 剔除服务端        $key = array_search($service, $copyServices);        unset($copyServices[$key]);    }    if ($copyServices) {        echo "服务端数量" . count($services);    }    # $copyServices剔除了服务端    # 还被socket_select剔除了没在接受消息的客户端    foreach ($copyServices as $c) {        $buf = socket_read($c, 8096);        # 消息可能是断开连接的信息,需要关闭并剔除客户端        if (strlen($buf) < 9) {            $key = array_search($c, $services);            unset($services[$key]);            socket_close($c);            continue;        }        #有消息的就输出消息        echo parseMessage($buf);        echo PHP_EOL;    }}//网上拷的服务端向客户端发送信息处理function createMessage($data){    $result = [0 => '81'];    $len = strlen($data);    if ($len < 126) {        $result[1] = $len < 16 ? '0' . dechex($len) : dechex($len);    } elseif ($len < 65025) {        $str = dechex($len);        $result[1] = '7e' . str_repeat('0', 4 - strlen($str)) . $str;    } else {        $str = dechex($len);        $result[1] = '7f' . str_repeat('0', 16 - strlen($str)) . $str;    }    $result2 = "";    for ($i = 0; $i < $len; $i++) {        $result2 .= dechex(ord($data[$i]));    }    $result[2] = $result2;    $response = implode('', $result);    return pack("H*", $response);}//网上拷的解析客户端发送给服务端的消息function parseMessage($data){    $res = "";    $len = ord($data[1]) & 127;    if ($len === 126) {        $make = substr($data, 4, 4);        $result = substr($data, 8);    } elseif ($len === 127) {        $make = substr($data, 10, 4);        $result = substr($data, 14);    } else {        $make = substr($data, 2, 4);        $result = substr($data, 6);    }    for ($i = 0; $i < strlen($result); $i++) {        $res .= $result[$i] ^ $make[$i % 4];    }    return $res;}socket_close($service);

来源地址:https://blog.csdn.net/qq_29744347/article/details/126919873

--结束END--

本文标题: php 实现websocket服务

本文链接: https://www.lsjlt.com/news/393359.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • php 实现websocket服务
    文章目录 前言流程握手 socket_read 读到的报文内容socket_select解析客户端发送的数据客户端发送消息处理前端连接示例完整示例 前言 之前使用的都是封...
    99+
    2023-09-04
    websocket php 网络协议
  • java WebSocket 服务端实现代码
    1.什么是WebSocket   WebSocket协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信——允许服务...
    99+
    2022-11-13
  • java WebSocket 服务端如何实现
    这篇文章给大家分享的是有关java WebSocket 服务端如何实现的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。什么是WebSocket  WebSocket协议是基于TCP的一种新的网络...
    99+
    2023-06-29
  • PHP实现WebSocket实例详解
    WebSocket 是什么? 摘抄网上的一些解释: WebSocket 协议是基于 TCP 的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信——允许服务...
    99+
    2022-11-12
  • 用Go+WebSocket快速实现一个chat服务
    前言 在 go-zero 开源之后,非常多的用户询问是否可以支持以及什么时候支持 websocket,终于在 v1.1.6 里面我们从框架层面让websocket 的支持落地了,下...
    99+
    2022-11-12
  • PHP Websocket开发指南,实现实时任务分发功能
    PHP Websocket开发指南,实现实时任务分发功能,需要具体代码示例引言:在现代Web应用程序中,实时任务分发功能变得越来越重要。通过实时任务分发,可以实现实时通信和实时更新,为用户提供更良好的交互体验。PHP Websocket是一...
    99+
    2023-12-09
    PHP websocket 实时任务分发
  • php workerman入门之搭建websocket服务
    依旧参考官网 简单的开发示例-workerman手册 示例二: ...
    99+
    2023-10-12
    websocket 网络协议 网络 php
  • golang实现websocket
    随着互联网技术的不断发展,实时连接成为了越来越多应用的必备功能。WebSocket 是一种基于 TCP 协议的网络协议,它允许服务器向客户端推送数据,实现实时双向通信。Go 是一门快速高效的编程语言,由于其简洁、高效等特点,成为了近年来非常...
    99+
    2023-05-22
  • 用Go+WebSocket快速实现一个chat服务
    前言 在 go-zero 开源之后,非常多的用户询问是否可以支持以及什么时候支持 websocket,终于在 v1.1.6 里面我们从框架层面让websocket 的支持落地...
    99+
    2022-06-07
    GO chat websocket
  • PHP+Socket系列之实现websocket聊天室
    本篇文章给大家带来了关于php+socket的相关知识,其中主要介绍了怎么使用php原生socket实现一个简易的web聊天室?感兴趣的朋友下面一起来看一下,希望对大家有帮助。 php原生s...
    99+
    2023-05-14
    php socket websocket
  • PHP+Socket之如何实现websocket聊天室
    这篇文章主要介绍了PHP+Socket之如何实现websocket聊天室的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇PHP+Socket之如何实现websocket聊天室文章都会有所收获,下面我们一起来看看吧...
    99+
    2023-07-05
  • 如何用PHP websocket实现网页实时聊天
    目录前言websocket简介与http的关系握手数据传输PHP 实现 websocket 服务器文件描述符创建服务器socket服务器逻辑客户端创建客户端页面功能用户名异步处理总结...
    99+
    2022-11-12
  • 如何使用PHP和WebSocket实现实时通信
    随着互联网技术的不断发展,实时通信已经成为了日常生活中不可缺少的一部分。利用WebSockets技术可以实现高效、低延迟的实时通信,而PHP作为互联网领域使用最广泛的开发语言之一,也提供了相应的WebSocket支持。本文将为大家介绍如何使...
    99+
    2023-12-17
    PHP websocket 实时通信
  • C#用websocket实现简易聊天功能(服务端)
    C# 利用websocket实现简易聊天功能——服务端,供大家参考,具体内容如下 前言 使用C#语言进行开发,基于.NET FrameWork4功能包含群聊,...
    99+
    2022-11-13
  • vue实现websocket客服聊天功能
    本文章主要介绍如何实现一个基本的聊天,后续会添加表情包,传照片等功能 其实刚开始接触的时候,我最大的疑惑是聊天功能的前期是否需要搭建什么框架、下载一些什么东西之类的,结果就是,其实w...
    99+
    2022-11-12
  • 使用php开发Websocket,实现实时推送功能
    标题:使用PHP开发Websocket,实现实时推送功能Websocket是一种基于TCP协议的通信协议,在Web开发中,可以使用Websocket实现实时推送功能,以实现实时通信或实时更新数据的需求。在本文中,我们将使用PHP语言开发We...
    99+
    2023-12-09
  • 怎么使用PHP websocket实现网页实时聊天
    小编给大家分享一下怎么使用PHP websocket实现网页实时聊天,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!正文开始前,先贴一张聊天室的效果图(请不要在意C...
    99+
    2023-06-15
  • PHP Websocket开发指南,实现实时翻译功能
    PHP Websocket开发指南:实现实时翻译功能引言:随着互联网的发展,实时通信在各种应用场景中变得越来越重要。而Websocket作为一种新兴的通信协议,为实现实时通信提供了良好的支持。本篇文章将带您详细了解如何使用PHP开发Webs...
    99+
    2023-12-18
    PHP websocket 实时翻译
  • 怎么使用Go+WebSocket快速实现一个chat服务
    这篇文章将为大家详细讲解有关怎么使用Go+WebSocket快速实现一个chat服务,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。前言在 go-zero 开源之后,非常多的用户询问是否可以支持以及什么时候...
    99+
    2023-06-14
  • WebSocket如何实现服务器消息推送客户端
    这篇文章主要为大家展示了“WebSocket如何实现服务器消息推送客户端”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“WebSocket如何实现服务器消息推送客户端”这篇文章吧。  一、背景  ...
    99+
    2023-06-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作