如何利用swoole搭建一個簡易聊天室
<?php
class Chat
{
const HOST = '0.0.0.0';//ip地址 0.0.0.0代表接受所有ip的访问
const PART = 82;//端口号
private $server = null;//单例存放websocket_server对象
private $connectList = [];//客户端的id集合 public function __construct()
{
//实例化swoole_websocket_server并存储在我们Chat类中的属性上,达到单例的设计
$this->server = new swoole_websocket_server(self::HOST, self::PART);
//监听连接事件
$this->server->on('open', [$this, 'onOpen']);
//监听接收消息事件
$this->server->on('message', [$this, 'onMessage']);
//监听关闭事件
$this->server->on('close', [$this, 'onClose']);
//设置允许访问静态文件
//$this->server->set([
// 'document_root' => '/grx/swoole/public',//这里传入静态文件的目录
// 'enable_static_handler' => true//允许访问静态文件
//]);
//开启服务
$this->server->start();
} /**
* 连接成功回调函数
* @param $server
* @param $request
*/
public function onOpen($server, $request)
{
echo $request->fd . '连接了' . PHP_EOL;//打印到我们终端
$this->connectList[] = $request->fd;//将请求对象上的fd,也就是客户端的唯一标识,可以把它理解为客户端id,存入集合中
} /**
* 接收到信息的回调函数
* @param $server
* @param $frame
*/
public function onMessage($server, $frame)
{
echo $frame->fd . '来了,说:' . $frame->data . PHP_EOL;//打印到我们终端
//将这个用户的信息存入集合
foreach ($this->connectList as $fd) {//遍历客户端的集合,拿到每个在线的客户端id
//将客户端发来的消息,推送给所有用户,也可以叫广播给所有在线客户端
$server->push($fd, json_encode(['no' => $frame->fd, 'msg' => $frame->data]));
}
} /**
* 断开连接回调函数
* @param $server
* @param $fd
*/
public function onClose($server, $fd)
{
echo $fd . '走了' . PHP_EOL;//打印到我们终端
$this->connectList = array_diff($this->connectList, [$fd]);//将断开了的客户端id,清除出集合
} } $obj = new Chat();
<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <title>聊天室</title>
    <script src="http://libs.baidu.com/jquery/1.9.1/jquery.min.js"></script>
</head>
<body>
<textarea class="log" style="width: 100%; height: 500px;">
=======聊天室======
</textarea>
<input type="button" value="连接" onClick="link()">
<input type="button" value="断开" onClick="dis()">
<input type="text" id="text">
<input type="button" value="发送" onClick="send()">
<script>
    function link(){
        var url='ws://148.70.98.236:82';
        socket=new WebSocket(url);
        socket.onopen=function(){log1('连接成功')}
        socket.onmessage=function(msg){log(msg.data);console.log(msg);}
        socket.onclose=function(){log1('断开连接')}
    }
    function dis(){
        socket.close();
        socket=null;
    }
    function log1(var1) {
        $('.log').append(var1+'\r\n');
    }
    function log(var1){
      var  v=$.parseJSON(var1)
        $('.log').append('用户'+v['no']+'说:'+v['msg']+'\r\n');
    }
    function send(){
        var text=$('#text').val();
        socket.send(text);
    }
    function send2(){
        var json = JSON.stringify({'type':'php','msg':$('#text2').attr('value')})
        socket.send(json);
    }
</script>
</body>
</html>
如何利用swoole搭建一個簡易聊天室的更多相关文章
- Node.js下基于Express + Socket.io 搭建一个基本的在线聊天室
		一.聊天室简单介绍 采用nodeJS设计,基于express框架,使用WebSocket编程之 socket.io机制.聊天室增加了 注册登录模块 ,并将用户个人信息和聊天记录存入数据库. 数据库采用 ... 
- 用Swoole+React 实现的聊天室
		前后端分离的项目,使用 Swoole+React 实现的聊天室,整个项目的框架结构可以进行参考,前端 react+react-redux+react-router+react-ant 等等,后台使用 ... 
- 使用Html5下WebSocket搭建简易聊天室
		一.Html5WebSocket介绍 WebSocket protocol 是HTML5一种新的协议(protocol).它是实现了浏览器与服务器全双工通信(full-duplex). 现在,很多网站 ... 
- 玩转Node.js(四)-搭建简单的聊天室
		玩转Node.js(四)-搭建简单的聊天室 Nodejs好久没有跟进了,最近想用它搞一个聊天室,然后便偶遇了socket.io这个东东,说是可以用它来简单的实现实时双向的基于事件的通讯机制.我便看了一 ... 
- 使用 NIO 搭建一个聊天室
		使用 NIO 搭建一个聊天室 前面刚讲了使用 Socket 搭建了一个 Http Server,在最后我们使用了 NIO 对 Server 进行了优化,然后有小伙伴问到怎么使用 Socket 搭建聊天 ... 
- Delphi APP 開發入門(三)簡易計算機
		Delphi APP 開發入門(三)簡易計算機 分享: Share on facebookShare on twitterShare on google_plusone_share 閲讀次數:68 ... 
- Kafka1  利用虚拟机搭建自己的Kafka集群
		前言: 上周末自己学习了一下Kafka,参考网上的文章,学习过程中还是比较顺利的,遇到的一些问题最终也都解决了,现在将学习的过程记录与此,供以后自己查阅,如果能帮助到其他人,自然是更好的. ... 
- ZooKeeper1  利用虚拟机搭建自己的ZooKeeper集群
		前言: 前段时间自己参考网上的文章,梳理了一下基于分布式环境部署的业务系统在解决数据一致性问题上的方案,其中有一个方案是使用ZooKeeper,加之在大数据处理中,ZooKeeper确实起 ... 
- Hadoop4  利用VMware搭建自己的hadoop集群
		前言: 前段时间自己学习如何部署伪分布式模式的hadoop环境,之前由于工作比较忙,学习的进度停滞了一段时间,所以今天抽出时间把最近学习的成果和大家分享一下. 本文要介绍的是如 ... 
随机推荐
- 第四章 Python数据分析-描述性分析
			Python基础统计 统计函数:describe() 常用的统计指标函数: 统计函数 注释 (@数据分析-jacky) size 计算 sum 求和 mean 平均值 var 方差 std 标准差 
- 【java设计模式】-03抽象工厂模式
			抽象工厂 简述 抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类.在抽象工厂模式中,接口是负责创建一个相关对象的工厂 ... 
- 1.3 JAVA规范以及基础语法(if条件和循环)
			一.规范以及运算符 1.命名规则 类名大驼峰规则方法名.变量名小驼峰原则常量大写.下划线分开见名释义.不与关键字冲突 关键字链接:https://www.runoob.com/java/java-ba ... 
- centos 安装mariadb 替代mysql
			yum install mariadb-server mariadb systemctl start mariadbmysql -uroot -p默认密码mysql -uroot -pmysql_se ... 
- H5-Mui框架——修改mui.confirm样式
			问题简述: 使用mui框架默认提示框时,感觉与整体布局不符,因此想要更改其中的样式. 首先,查了一下资料:mui.toast样式风格及位置修改教程 以下是转载过来的文章内容. ============ ... 
- LeetCode 101. 对称二叉树(Symmetric Tree)
			题目描述 给定一个二叉树,检查它是否是镜像对称的. 例如,二叉树 [1,2,2,3,4,4,3] 是对称的. 1 / \ 2 2 / \ / \ 3 4 4 3 但是下面这个 [1,2,2,null, ... 
- maven plugin
			assembly plugin [Maven学习]maven-assembly-plugin的使用 https://www.cnblogs.com/f-zhao/p/6929814.html使用Mav ... 
- Android跨进程通信Messenger
			一.概述 我们可以在客户端发送一个Message给服务端,在服务端的handler中会接收到客户端的消息,然后进行对应的处理,处理完成后,再将结果等数据封装成Message,发送给客户端,客户端的ha ... 
- Nginx优化之基本安全优化           (隐藏Nginx软件版本号信息,更改源码隐藏Nginx软件名及版本号,更改Nginx服务的默认用户)
			一,隐藏Nginx软件版本号信息 查看版本号 curl -I 192.168.0.220 HTTP/1.1 200 OK Server: nginx/1.6.2 #这里清晰的暴露了Web版本号(1.6 ... 
- LC 377. Combination Sum IV
			Given an integer array with all positive numbers and no duplicates, find the number of possible comb ... 
