简单的聊天室代码php+swoole

摘要:
phpswoole+websocket客户端代码˂!

php swoole+websocket

客户端代码

<!DOCTYPE html>
<html>
<head>
    <title></title>
    <meta name="viewport"content="width=device-width,initial-scale=1">
    <meta charset="utf-8"/>
    <link rel="stylesheet"href="http://cdn.bootcss.com/bootstrap/3.3.4/css/bootstrap.min.css">
    <link rel="stylesheet"href="http://cdn.bootcss.com/bootstrap/3.3.4/css/bootstrap-theme.min.css">
    <script src="http://cdn.bootcss.com/jquery/1.11.2/jquery.min.js"></script>
    <script src="http://cdn.bootcss.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>
    <script src="http://cdn.bootcss.com/socket.io/1.3.5/socket.io.js"></script>
</head>
<body>
<div id="box"style="max-700px;margin:0 auto;">
    <div class="panel panel-default">
        <div class="panel-heading"><h2>聊天室</h2><span style="color:green;display:none;">(当前在线:<span id="length">0</span>人)</span></div>
        <div class="panel-body"id="body"style="height:400px;overflow-y:auto;">
        </div>
    </div>
    <div class="input-group">
        <input type="text"class="form-control"id="in"placeholder="您想说什么?"aria-describedby="basic-addon2">
        <span class="input-group-addon"id="basic-addon2"style="cursor:pointer;">发送</span>
    </div>
</div>
<div class="modal fade bs-example-modal-sm"data-backdrop="static"id="model"tabindex="-1"role="dialog"aria-labelledby="mySmallModalLabel"aria-hidden="true">
  <div class="modal-dialog modal-sm">
    <div class="modal-content">
        <div class="input-group">
            <input type="text"class="form-control"id="name"placeholder="请输入您的昵称"aria-describedby="basic-addon3">
            <span class="input-group-addon"id="basic-addon3"style="cursor:pointer;">开始聊天</span>
        </div>
    </div>
  </div>
</div>
</body>
<script>
$(document).ready(function(){
    window.username = 'others';
    varwsServer = 'ws://192.168.151.125:9502';
    varwebsocket = newWebSocket(wsServer);
    websocket.onopen = function(evt) {
        console.log("Connected to WebSocket server.");
        $("#model").modal('show');
    };    
    websocket.onmessage = function(evt) {
        console.log('Retrieved data from server: ' +evt.data);
        $(".panel-body").append(evt.data);
        //$(".panel-body").append('<p><span style="color:#177bbb">'+evt.data.username+'</span> <span style="color:#aaaaaa">('+evt.data.time+')</span>: '+evt.data.msg+'</p>');
        varbody =document.getElementById("body");
        body.scrollTop =body.scrollHeight;
        $("#in").focus();        
    };
    $("#basic-addon2").click(function(){
        varmsg =$("#in").val();
        websocket.send(msg);
        $("#in").val('');
    });
    $("#basic-addon3").click(function(){
        window.username =$("#name").val();
        websocket.send("login|@|"+window.username);        
        $("#model").modal('hide');
    });
});
</script>
</html>

php代码

安装

swoole扩展(php官方已经支持)

可直接安装

linux执行

pecl install swoole

成功后查看phpinfo是否安装成功swoole

服务端代码

date_default_timezone_set('PRC');
$users = array();
//创建websocket服务器对象,监听0.0.0.0:9502端口
$ws = new swoole_websocket_server("0.0.0.0", 9502);
$ws->set(array(
    'worker_num' => 1,
));
//监听WebSocket连接打开事件
$ws->on('open', function ($ws, $request) {
   //var_dump($request->fd, $request->get, $request->server);
    //global $users;
   // var_dump($users);
   // $users[] = $request->fd;
    //var_dump($users);
   //$ws->push($request->fd, "hello, welcome
");
});
//监听WebSocket消息事件
$ws->on('message', function ($ws, $frame) {
    global $users;
//var_dump($frame);
    $data = $frame->data;
    $arr = explode('n|@|',$data);
    if(count($arr)>1){
      $users[$frame->fd] = $arr[1];
      foreach($users as $fd=>$name){
         $ws->push($fd,'<p><span style="color:#177bbb">系统通知</span><span style="color:#aaaaaa">('.date('H:i:s').')</span>:'.$arr[1].'加入聊天</p>');
      }
    }else{
     //var_dump($users);
      foreach($users as $fd=>$name){
        //$msg = 'from'.$name.":{$frame->data}
";
        $msg = '<p><span style="color:#177bbb">'.$users[$frame->fd].'</span> <span style="color:#aaaaaa">('.date('H:i:s').')</span>: '.$frame->data.'</p>';
        $ws->push($fd,$msg);
      }
    }
});
//监听WebSocket连接关闭事件
$ws->on('close', function ($ws, $fd) {
    echo "client-{$fd} is closed
";
});
$ws->start();

简单的聊天室就ok了

免责声明:文章转载自《简单的聊天室代码php+swoole》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇UOS安装zerotier-one(转)string中的format下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

LaravelS

LaravelS LaravelS是一个胶水项目,用于快速集成Swoole到Laravel或Lumen,然后赋予它们更好的性能、更多可能性。Github 特性 内置Http/WebSocket服务器 多端口混合协议 协程 自定义进程 常驻内存 异步的事件监听 异步的任务队列 毫秒级定时任务 平滑Reload 修改代码后自动Reload 同时支持Lar...

操作系统知识总结

操作系统 面向进程和线程学习操作系统。 目录 Chapter 1 Chapter 2 Chapter 3 Chapter 4 Chapter 5 进程线程模型 进程间通信 同步互斥机制 存储管理 网络I/O模型 内容 进程线程模型 线程和进程的概念已经在操作系统书中被翻来覆去讲了很多遍。很多概念虽然都是套话,但没能理解透其中深意会导致很多内容...

异步通知机制的总结

要弄明白这个问题,我们得从最基本的原理开始。我们知道,驱动程序运行在内核空间中,应用程序运行 在用户空间中,两者是不能直接通信的。但在实际应用中,在设备已经准备好的时候,我们希望通知用户 程序设备已经ok,用户程序可以读取了,这样应用程序就不需要一直查询该设备的状态,从而节约了资源 ,这就是异步通知。 好,那下一个问题就来了,这个过程如何实现呢?简单,...

Linux基础(08)信号通信机制

1.Linux中的信号(有32个)   信号会中断一些函数的阻塞 https://zhidao.baidu.com/question/1766690354480323100.html #define SIGHUP 1 #define SIGINT 2 #define SIGQUIT 3 #define SI...

获取linux系统RTC设备的时钟

由于linux和windows的不同,这个结构体不能使用 库文件中的tm结构体 代码 #include<sys/ioctl.h>structrtc_time{inttm_sec;inttm_min;inttm_hour;inttm_mday;inttm_mon;inttm_year;inttm_wday;inttm_yday;inttm_is...

vue中el-upload上传多图片且携带参数,批量而不是一张一张的解决方案

现在前端基本不是vue技术栈就是react技术栈。 vue技术栈最常用的就是element-ui的ui框架了。 在项目中,我们经常会碰到这种需求:批量上传文件 element-ui 确实也为我们提供了<el-upload>这样的组件,同事也暴露了很多的属性和方法供我们使用。 但是很多人却碰到了这样的问题:项目需求是批量上传,但是为什么自己上传的...