精华内容
下载资源
问答
  • php支持websocket实例

    2017-05-04 13:10:58
    php服务,支持html5 websocket。在命令行下 键入 php pws.php,开启服务。打开pws.html网页即可。
  • WebSocket在线测试工具 http://ws.douqq.com/ 1、连接格式为 ws://IP/域名:端口(示例ws://119.29.3.36:5354) 2、对于内网的测试环境,只需填入服务端的内网IP和端口 3、可连接我上面提供的服务端ws地址来测试您...

    WebSocket在线测试工具 http://ws.douqq.com/

    1、连接格式为 ws://IP/域名:端口(示例ws://119.29.3.36:5354)
    2、对于内网的测试环境,只需填入服务端的内网IP和端口
    3、可连接我上面提供的服务端ws地址来测试您自己的客户端

     

    本站支持QQ机器人发消息,先加机器人QQ:625789120为好友测试

     

    1.好友消息格式 {"type":"1","qq":"94113786","qun":"","msg":"你好"}

     

    2.群组消息格式 {"type":"2","qun":"293271355","qq":"","msg":"你好"}

     

    3.点赞 {"type":"3","qq":"94113786"}

     

    4.查赞 {"type":"4","qq":"94113786"}

     

    转载于:https://www.cnblogs.com/daxiangxm/p/websocket.html

    展开全文
  • php websocket聊天实例,即时发送消息,即时接收消息;已通过调试运行能用
  • 本文通过实例代码给大家介绍了php redis 处理websocket聊天记录的相关知识,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
  • 上文讲解php7基于event的socket的demo,本文讲解的是libevent的socket实例。 libevent管理类/** * 基于libevent的webSocket连接,不支持php7 */ class MyLibEvent { protected $eventBase; p

    由于libevent不支持php7,本demo采用的php版本是:php5.6.30
    上文讲解php7基于event的socket的demo,本文讲解的是libevent的socket实例。
    libevent管理类

    /**
     * 基于libevent的webSocket连接,不支持php7
     */
    class MyLibEvent
    {
        protected $eventBase;
        protected $allEvents = [];
    
        public function __construct()
        {
            if (!extension_loaded('libevent')) {
                echo 'libevent extension is require' . PHP_EOL;
                exit(250);
            }
            $this->eventBase = event_base_new();
        }
    
        public function add($fd, $flag, $func, $args = array())
        {
            $fd_key = (int)$fd;
            $event = event_new();
            if (!event_set($event, $fd, $flag | EV_PERSIST, $func, null)) {
                return false;
            }
            if (!event_base_set($event, $this->eventBase)) {
                return false;
            }
            if (!event_add($event)) {
                return false;
            }
    
            $this->allEvents[$fd_key][$flag] = $event;
            return true;
        }
    
        public function del($fd, $flag)
        {
            $fd_key = (int)$fd;
            if (isset($this->allEvents[$fd_key][$flag])) {
                event_del($this->allEvents[$fd_key][$flag]);
                unset($this->allEvents[$fd_key][$flag]);
            }
            if (empty($this->allEvents[$fd_key])) {
                unset($this->allEvents[$fd_key]);
            }
        }
    
        public function loop()
        {
            event_base_loop($this->eventBase);
        }
    }

    socket管理类

    class Socket
    {
        const READ_BUFFER_SIZE = 65535;
        protected $mainSocket;
        protected $context;
        protected $socketName;
        protected static $connectPools = [];
        protected $sendBuffer;
        public $reusePort = false;
        protected $eventBase;
        protected $event;
    
    
        public function __construct($socketName, $context = [])
        {
            $this->socketName = $socketName;
            $this->context = stream_context_create($context);
            $this->event = new MyLibEvent();
        }
    
        public function start()
        {
            if ($this->reusePort) {
                stream_context_set_option($this->context, 'socket', 'so_reuseport', 1);
            }
    
            $local_socket = $this->socketName;
            $errorNo = 0;
            $errorMsg = '';
            $this->mainSocket = stream_socket_server($local_socket, $errorNo, $errorMsg, STREAM_SERVER_BIND | STREAM_SERVER_LISTEN, $this->context);
    
            if (function_exists('socket_import_stream')) {
                $socket = socket_import_stream($this->mainSocket);
                @socket_set_option($socket, SOL_SOCKET, SO_KEEPALIVE, 1);
                @socket_set_option($socket, SOL_TCP, TCP_NODELAY, 1);
            }
    
            stream_set_blocking($this->mainSocket, 0);
    
            if (function_exists('stream_set_read_buffer')) {
                stream_set_read_buffer($this->mainSocket, 0);
            }
    
            $flags = EV_READ;
    
            $this->event->add($this->mainSocket, $flags, [$this, 'accept']);
            $this->event->loop();
        }
    
    
        public function baseRead($socket)
        {
            $this->connect($socket);
    
            $buffer = fread($socket, self::READ_BUFFER_SIZE);
    
            if ($buffer === '' || $buffer === false) {
                $this->disconnect($socket);
                return;
            }
            if (false === self::$connectPools[(int)$socket]['handshake']) {
                self::$connectPools[(int)$socket]['handshake'] = $this->toHandshake($socket, $buffer);
            } else {
                $buffer = $this->decode($buffer);
                $this->send($socket, $buffer);
            }
        }
    
    
        public function accept($_socket)
        {
            $socket = @stream_socket_accept($_socket, 0, $remote_address);
    
            if (!$socket) {
                return;
            }
            stream_set_blocking($socket, 0);
    
            if (function_exists('stream_set_read_buffer')) {
                stream_set_read_buffer($socket, 0);
            }
    
            $flags = EV_READ;
            $this->event->add($socket, $flags, [$this, 'baseRead']);
        }
    
        //打包函数 返回帧处理
        protected function frame($buffer)
        {
            $len = strlen($buffer);
            if ($len <= 125) {
    
                return "\x81" . chr($len) . $buffer;
            } else if ($len <= 65535) {
    
                return "\x81" . chr(126) . pack("n", $len) . $buffer;
            } else {
    
                return "\x81" . char(127) . pack("xxxxN", $len) . $buffer;
            }
        }
    
    
        //解码 解析数据帧
        protected function decode($buffer)
        {
            $masks = $data = $decoded = null;
            $len = ord($buffer[1]) & 127;
    
            if ($len === 126) {
                $masks = substr($buffer, 4, 4);
                $data = substr($buffer, 8);
            } else if ($len === 127) {
                $masks = substr($buffer, 10, 4);
                $data = substr($buffer, 14);
            } else {
                $masks = substr($buffer, 2, 4);
                $data = substr($buffer, 6);
            }
            for ($index = 0; $index < strlen($data); $index++) {
                $decoded .= $data[$index] ^ $masks[$index % 4];
            }
            return $decoded;
        }
    
        protected function toHandshake($socket, $buffer)
        {
            list($resource, $host, $origin, $key) = $this->getHeaders($buffer);
            $upgrade = "HTTP/1.1 101 Switching Protocol\r\n" .
                "Upgrade: websocket\r\n" .
                "Connection: Upgrade\r\n" .
                "Sec-WebSocket-Accept: " . $this->calcKey($key) . "\r\n\r\n";  //必须以两个回车结尾
    
            $this->send($socket, $upgrade,false);
            return true;
        }
    
        public function send($socket, $buffer,$frame = true)
        {
            if($frame){
                $buffer = $this->frame($buffer);
            }
            $this->sendBuffer = $buffer;
            $this->event->add($socket, EV_WRITE, [$this, 'baseWrite']);
        }
    
        public function baseWrite($socket)
        {
            $len = @fwrite($socket, $this->sendBuffer, 8192);
            if ($len === strlen($this->sendBuffer)) {
                $this->event->del($socket, EV_WRITE);
            }
        }
    
    
        protected function getHeaders($req)
        {
            $r = $h = $o = $key = null;
            if (preg_match("/GET (.*) HTTP/", $req, $match)) {
                $r = $match[1];
            }
            if (preg_match("/Host: (.*)\r\n/", $req, $match)) {
                $h = $match[1];
            }
            if (preg_match("/Origin: (.*)\r\n/", $req, $match)) {
                $o = $match[1];
            }
            if (preg_match("/Sec-WebSocket-Key: (.*)\r\n/", $req, $match)) {
                $key = $match[1];
            }
            return [$r, $h, $o, $key];
        }
    
        protected function calcKey($key)
        {
            //基于websocket version 13
            $accept = base64_encode(sha1($key . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11', true));
            return $accept;
        }
    
        protected function connect($socket)
        {
            $fd_key = (int)$socket;
            if (!isset(self::$connectPools[$fd_key])) {
                $connect['handshake'] = false;
                $connect['fd'] = $socket;
                self::$connectPools[$fd_key] = $connect;
            }
        }
    
        protected function disconnect($socket)
        {
            $fd_key = (int)$socket;
            if (isset(self::$connectPools[$fd_key])) {
                unset(self::$connectPools[$fd_key]);
                $this->event->del($socket, EV_READ);
                $this->event->del($socket, EV_WRITE);
                @fclose($socket);
            }
    
        }
    }

    运行

    <?php
    $connect = 'tcp://0.0.0.0:8952';
    $socket = new Socket($connect);
    $socket->start();

    结果如下

    展开全文
  • C#版Websocket实例

    2019-09-28 14:24:37
    C#版Websocket实例 Demo地址:www.awbeci.xyz websocket有java、nodejs、python,Php等等版本,我使用的是C#版本,服务器端是Fleck,github地址:https://github.com/statianzo/Fleck 这篇博客就是引用上面...

    C#版Websocket实例

     

    Demo地址:www.awbeci.xyz

    websocket有java、nodejs、python,Php等等版本,我使用的是C#版本,服务器端是Fleck,github地址:https://github.com/statianzo/Fleck

    这篇博客就是引用上面的一个例子教你如何使用客户端和服务器端来使用websocket的,对于英文还不错的同学,直接看上面 的源代码就可以了,下面开始讲解如何使用:

    在说之前我们先来看看哪些浏览器支持websocket:

    WebSocket客户端支持
    浏览器支持情况
    Chrome Chrome version 4+支持
    Firefox Firefox version 5+支持
    IE IE version 10+支持
    Safari IOS 5+支持
    Android Brower Android 4.5+支持
    WebSocket 服务端支持
    厂商应用服务器备注
    IBM WebSphere WebSphere 8.0 以上版本支持,7.X 之前版本结合 MQTT 支持类似的 HTTP 长连接
    甲骨文 WebLogic WebLogic 12c 支持,11g 及 10g 版本通过 HTTP Publish 支持类似的 HTTP 长连接
    微软 IIS IIS 7.0+支持
    Apache Tomcat Tomcat 7.0.5+支持,7.0.2X 及 7.0.3X 通过自定义 API 支持
      Jetty Jetty 7.0+支持

     

    现在我们看看浏览器端如何实现:

    复制代码
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <html>
    <head>
        <title>websocket client</title>
        <script type="text/javascript">
            var start = function () {
                var inc = document.getElementById('incomming');
                var wsImpl = window.WebSocket || window.MozWebSocket;
                var form = document.getElementById('sendForm');
                var input = document.getElementById('sendText');
    
                inc.innerHTML += "connecting to server ..<br/>";
    
                // create a new websocket and connect
                window.ws = new wsImpl('ws://localhost:7181/');
    
                // when data is comming from the server, this metod is called
                ws.onmessage = function (evt) {
                    inc.innerHTML += evt.data + '<br/>';
                };
    
                // when the connection is established, this method is called
                ws.onopen = function () {
                    inc.innerHTML += '.. connection open<br/>';
                };
    
                // when the connection is closed, this method is called
                ws.onclose = function () {
                    inc.innerHTML += '.. connection closed<br/>';
                }
    
                form.addEventListener('submit', function (e) {
                    e.preventDefault();
                    var val = input.value;
                    ws.send(val);
                    input.value = "";
                });
    
            }
            window.onload = start;
        </script>
    </head>
    <body>
        <form id="sendForm">
            <input id="sendText" placeholder="Text to send" />
        </form>
        <pre id="incomming"></pre>
    </body>
    </html>
    复制代码

    服务器端我使用的是C#的控制台程序:

    复制代码
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using Fleck;
    
    namespace TopoWebSocket
    {
        class Program
        {
            static void Main(string[] args)
            {
                FleckLog.Level = LogLevel.Debug;
                var allSockets = new List<IWebSocketConnection>();
                var server = new WebSocketServer("ws://0.0.0.0:7181");
                server.Start(socket =>
                {
                    socket.OnOpen = () =>
                    {
                        Console.WriteLine("Open!");
                        allSockets.Add(socket);
                    };
                    socket.OnClose = () =>
                    {
                        Console.WriteLine("Close!");
                        allSockets.Remove(socket);
                    };
                    socket.OnMessage = message =>
                    {
                        Console.WriteLine(message);
                        allSockets.ToList().ForEach(s => s.Send("Echo: " + message));
                    };
                });
    
    
                var input = Console.ReadLine();
                while (input != "exit")
                {
                    foreach (var socket in allSockets.ToList())
                    {
                        socket.Send(input);
                    }
                    input = Console.ReadLine();
                }
            }
        }
    }
    复制代码

    注意要引用:using Fleck;这个在上面的链接里面已经提供了。代码都写好后,我们来运行下服务器端吧,客户端也可以,总之两个都运行好:如图:

    现在你可以客户端向服务器端发送消息了,我们试试,输入你好世界:

    然后我们再在服务器端发送消息给浏览器试试,如,HelloWorld

    也成功了,呵呵,是不是很神奇,现在可以添加自己 的业务逻辑在里面了,是不是 觉得前后台通信变得简单了。

    总结:

    1、这个例子不是我写的,我只不过在github上拿过来给你们介绍,你们可以通过上面的例子fork下源代码,自己看看分析分析别人是怎么用的

    2、如果有问题可以加群问我:464696550

     3、参考资料:http://www.ibm.com/developerworks/cn/java/j-lo-WebSocket/

    转载于:https://www.cnblogs.com/cjm123/p/9674506.html

    展开全文
  • WebSocket是什么?WebSocket是一个持久化的协议,这是相对于http非持久化来说的。举个简单的例子,http1.0的生命周期是以request作为界定的,也就是一个request,一个response,对于http来说,本次client与server的...

    WebSocket是什么?

    WebSocket是一个持久化的协议,这是相对于http非持久化来说的。举个简单的例子,http1.0的生命周期是以request作为界定的,也就是一个request,一个response,对于http来说,本次client与server的会话到此结束;而在http1.1中,稍微有所改进,即添加了keep-alive,也就是在一个http连接中可以进行多个request请求和多个response接受操作。然而在实时通信中,并没有多大的作用,http只能由client发起请求,server才能返回信息,即server不能主动向client推送信息,无法满足实时通信的要求。而WebSocket可以进行持久化连接,即client只需进行一次握手,成功后即可持续进行数据通信,值得关注的是WebSocket实现client与server之间全双工通信,即server端有数据更新时可以主动推送给client端。

    下面的图演示了 client 和 server 之间建立 websocket 连接时握手部分,这个部分在 node 中可以十分轻松的完成,因为 node 提供的 net 模块已经对 socket 套接字做了封装处理,开发者使用的时候只需要考虑数据的交互而不用处理连接的建立。

    client与server建立socket时握手的会话内容,即request与response

    a、client建立WebSocket时向服务器端请求的信息GET /chat HTTP/1.1

    Host: server.example.com

    Upgrade: websocket //告诉服务器现在发送的是WebSocket协议

    Connection: Upgrade

    Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw== //是一个Base64 encode的值,这个是浏览器随机生成的,用于验证服务器端返回数据是否是WebSocket助理

    Sec-WebSocket-Protocol: chat, superchat

    Sec-WebSocket-Version: 13

    Origin: php.cn

    b、服务器获取到client请求的信息后,根据WebSocket协议对数据进行处理并返回,其中要对Sec-WebSocket-Key进行加密等操作HTTP/1.1 101 Switching Protocols

    Upgrade: websocket //依然是固定的,告诉客户端即将升级的是Websocket协议,而不是mozillasocket,lurnarsocket或者shitsocket

    Connection: Upgrade

    Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk= //这个则是经过服务器确认,并且加密过后的 Sec-WebSocket-Key,也就是client要求建立WebSocket验证的凭证

    Sec-WebSocket-Protocol: chat

    PHP中建立socket的过程讲解

    1、在PHP中,client与server之间建立socket通信,首先在PHP中创建socket并监听端口信息,代码如下:<?php

    //传相应的IP与端口进行创建socket操作

    function WebSocket($address,$port){

    $server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

    socket_set_option($server, SOL_SOCKET, SO_REUSEADDR, 1);//1表示接受所有的数据包

    socket_bind($server, $address, $port);

    socket_listen($server);return $server;

    }

    ?>

    2、设计一个循环挂起WebSocket通道,进行数据的接收、处理和发送<?php

    //对创建的socket循环进行监听,处理数据

    function run(){

    //死循环,直到socket断开

    while(true){

    $changes=$this->sockets;

    $write=NULL;

    $except=NULL;

    /*

    //这个函数是同时接受多个连接的关键,我的理解它是为了阻塞程序继续往下执行。

    socket_select ($sockets, $write = NULL, $except = NULL, NULL);

    $sockets可以理解为一个数组,这个数组中存放的是文件描述符。当它有变化(就是有新消息到或者有客户端连接/断开)时,socket_select函数才会返回,继续往下执行。

    $write是监听是否有客户端写数据,传入NULL是不关心是否有写变化。

    $except是$sockets里面要被排除的元素,传入NULL是”监听”全部。

    最后一个参数是超时时间

    如果为0:则立即结束

    如果为n>1: 则最多在n秒后结束,如遇某一个连接有新动态,则提前返回

    如果为null:如遇某一个连接有新动态,则返回

    */

    socket_select($changes,$write,$except,NULL);

    foreach($changes as $sock){

    //如果有新的client连接进来,则

    if($sock==$this->master){

    //接受一个socket连接

    $client=socket_accept($this->master);

    //给新连接进来的socket一个唯一的ID

    $key=uniqid();

    $this->sockets[]=$client; //将新连接进来的socket存进连接池

    $this->users[$key]=array(

    'socket'=>$client, //记录新连接进来client的socket信息

    'shou'=>false //标志该socket资源没有完成握手

    );

    //否则1.为client断开socket连接,2.client发送信息

    }else{

    $len=0;

    $buffer='';

    //读取该socket的信息,注意:第二个参数是引用传参即接收数据,第三个参数是接收数据的长度

    do{

    $l=socket_recv($sock,$buf,1000,0);

    $len+=$l;

    $buffer.=$buf;

    }while($l==1000);

    //根据socket在user池里面查找相应的$k,即健ID

    $k=$this->search($sock);

    //如果接收的信息长度小于7,则该client的socket为断开连接

    if($len<7){

    //给该client的socket进行断开操作,并在$this->sockets和$this->users里面进行删除

    $this->send2($k);

    continue;

    }

    //判断该socket是否已经握手

    if(!$this->users[$k]['shou']){

    //如果没有握手,则进行握手处理

    $this->woshou($k,$buffer);

    }else{

    //走到这里就是该client发送信息了,对接受到的信息进行uncode处理

    $buffer = $this->uncode($buffer,$k);

    if($buffer==false){

    continue;

    }

    //如果不为空,则进行消息推送操作

    $this->send($k,$buffer);

    }

    }

    }

    }

    }

    ?>

    3、以上服务器端完成的WebSocket的前期工作后,就等着client连接进行,client创建WebSocket很简单,代码如下:var ws = new WebSocket("ws://IP:端口");

    //握手监听函数

    ws.onopen=function(){

    //状态为1证明握手成功,然后把client自定义的名字发送过去

    if(so.readyState==1){

    //握手成功后对服务器发送信息

    so.send('type=add&ming='+n);

    }

    }

    //错误返回信息函数

    ws.onerror = function(){

    console.log("error");

    };

    //监听服务器端推送的消息

    ws.onmessage = function (msg){

    console.log(msg);

    }

    //断开WebSocket连接

    ws.onclose = function(){

    ws = false;

    }

    【相关教程推荐】

    展开全文
  • html5+php websocket实时聊天实例

    热门讨论 2013-06-04 15:50:38
    php不擅长做实时聊天,长轮询是一种低效的方法,其它又难以实现,但如果用websocket就好了,高效并且容易使用. 之前找到的一直不能用,这个基本测试通过~
  • Html5 Websocket 实时聊天实例php版)
  • 4、用一个聊天室作为实例详细讲解在PHP中如何使用socket PHP中建立socket的过程讲解 1、在PHP中,client与server之间建立socket通信,首先在PHP中创建socket并监听端口信息,代码如下: //传相应的IP与...
  • Win7搭建nginx+php+mysql开发环境以及websocket聊天实例测试一、下载相关安装包1.下载nginx最新版本(nginx1.3.13版之后才支持websocket协议)下载地址:http://www.nginx.cn/nginx-download2.下载php5.4.8版本(目前...
  • 谈谈php中使用websocket实例

    千次阅读 2016-10-23 16:05:13
    PHP中,开发者需要考虑的东西比较多,从socket的连接、建立、绑定、监听等都需要开发者自己去操作完成,对于初学者来说,难度方面也...4、用一个聊天室作为实例详细讲解在PHP中如何使用socket 一、socket协议的简
  • php swoole构建webSocket连接的简单实例

    千次阅读 2018-09-20 14:51:45
    1.客户端: &lt;!DOCTYPE html&gt; &lt;html lang="en"&gt; &lt;head&...webSocket&lt;/title&gt; &lt;/head&gt; &lt;body&gt; &
  • 转:http://www.cnblogs.com/zhangwei595806165/p/4791589.html?utm_source=tuicoolwebsocket有java、nodejs、python,Php等等版本,我使用的是C#版本,服务器端是Fleck,github地址:...
  • WebSocket是一种允许通过保持服务器端和用户端始终连接来进行双向通信的技术,这使得可以实时通信,例如聊天应用程序和多人可以同时...为了能够使用带有JavaScript的WebSocket,首先要创建实例。var connection = n...
  • php的socket编程方式有多种方式,本文只介绍以下三种 php自带select()方法 基于pecl的event库(linux需要安装libevent开发库) 基于pecl的libevent库(linux需要安装libevent开发库)本文只介绍event的实现 event是PECL...
  • websocket/**0:未连接1:连接成功,可通讯2:正在关闭3:连接已关闭或无法打开*///创建一个webSocket 实例var webSocket = new WebSocket("ws://192.168.31.152:8083");webSocket.onerror = function (event){on...

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 142
精华内容 56
关键字:

php实例websocket