websocket即时通信 php

websocket实现了服务器与客户端的双向通信,即使客户端没有请求,服务器端也可以主动发送消息。

部分主要代码如下:

public function run(){
        $this->service(); //开启websocket函数  
        $clients[] = $this->_sockets; //服务器端连接信息 clients数组保存着已连接用户的标识信息 
        while (true){ //挂起进程  
            $changes = $clients;
            $write = NULL;
            $except = NULL;
            //如果是新连接  是只有服务器端是活跃的  $this->_sockets永远是服务器端  
            //如果是发送消息,是某个客户端活跃  如果是某个客户断开连接,这个客户也视为活跃
            socket_select($changes,  $write,  $except, NULL); //筛选活跃连接,如果没有活跃连接将阻塞程序。
            foreach ($changes as $key => $_sock){
                if($this->_sockets == $_sock){ //判断是不是新接入的socket
                    if(($newClient = socket_accept($_sock))  === false){
                        die('failed to accept socket: '.socket_strerror($_sock)."\n");
                    }
                    $line = trim(socket_read($newClient, 1024));
                    $this->handshaking($newClient, $line); //握手处理函数 
                    socket_getpeername ($newClient, $ip); //获取client ip
                    $clients[] = $newClient;
                    echo  "Client ip:{$ip}   \n";
                    echo "Client msg:{$line} \n";
                    
                } else {
                    socket_recv($_sock, $buffer,  2048, 0);
                    $msg = $this->message($buffer); //解析接受数据函数
                    //在这里业务代码
                    echo "{$key} clinet msg:",$msg,"\n";
                    fwrite(STDOUT, 'Please input a argument:');
                    $response = trim(fgets(STDIN));
                    $this->send($_sock, $response); //发送消息函数
                    echo "{$key} response to Client:".$response,"\n";
                }
            }
        }
    }

while(true)通过无限循环来挂起程序。

socket_select()函数的作用就是筛选活跃的连接(就是有新消息到或者有客户端连接/断开)如果有,程序继续执行,如果没有,阻塞程序执行。

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

$changes是所有已连接用户,当它有变化(就是有新消息到或者有客户端连接/断开)时,socket_select()函数会把活跃连接筛选出来并返回给$changs,程序继续往下执行。
$write是监听是否有客户端写数据,传入NULL是不关心是否有写变化。
$except是$sockets里面要被排除的元素,传入NULL是监听全部。
最后一个参数是超时时间,这里设为null:如遇某一个连接有新动态,则返回。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PHP写得及时聊天工具,结构设计的很好,有源码。是学习PHP的好资料 JeCat-Jabber(简称:JJ) 是一款完全由 PHP 开发的即时通讯软件。JJ 采用 Gtk2 图像界面库来实现用户界面。顾名思义 JJ 使用 Jabber 协议(XMPP) ,因此可以 和 包括 GTalk 在内的 其它任何 XMPP 即时通讯软件 聊天。 JJ 项目的初衷在于 演示 桌面窗口 和 PHP 多任务处理,这两大 在长期在 PHP程序员 眼中 几乎是“不可能”的任务。 同时 也是 PHP框架 JCAT 的演示项目,JCAT 是一款同时 支持 Web 和 桌面 的 PHP框架,按照计划 将在稍后 发布。 JJ 的特点 > 跨平台。JJ 在Linxu 环境下 开发,在 Windows 平台上也一样可以正常使用。 > 实用 标准的 XMPP协议,能够与其它的 Jabber 软件互相通讯,例如 Google GTalk、Pidgin、PSI、Spark、Pandion,以及其它的 Jabber网页聊天窗口 > 可更换界面皮肤,皮肤样式文件 采用 类似 CSS 的语法,便于美工独立工作。 > 纯 PHP 实现,从 通讯协议 到 图形界面,全部都由 PHP 开发,如果你正好是一名 PHP 程序员,你可以驾轻就熟地在 JJ 之上进行二次开发。 > 可整合到你的网站中。JJ 近期的完善 会使 JJ 更容易地 为你的网站所有,让你的网站 也可以有像 淘宝旺旺 那样的 专用聊天工具 [ PHP 图像界面 ] JJ 采用 Gtk图像界面库,Gtk库 中 提供了丰富的 图形界面窗体(Widget),以及灵活方便的 窗体布局方式。 Gtk 本身 被广泛应用在 Linux 平台上,Linux 最著名 的桌面环境之一 Gnome 即是众多 Gtk软件 的集中展示。 PHP-Gtk2 将 Gtk 窗体绑定到 PHP 语言中,允许程序员 通过 PHP语言 来创建、显示、销毁 Gtk 窗体。PHP-Gtk 项目由 PHP创始人 亲自负责,并且自项目创立一来 一直持续发展,目前已经支持 最新的 Gtk2。 [ PHP 多任务处理 ] PHP 直到 5.2都没有提供 稳定可靠的 多线程特性。 但 PHP 仍然有能力进行多任务处理。 多线程 因为涉及到 线程安全、线程同步 等 困难,在 支持线程的语言中,也常常建议尽量避免使用。 Linux 的多路复用 是 更稳定和安全的 多任务模式,从 PHP5.0 开始 多路复用 支持 Windows 平台。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值