首先,我想说下写代码的一些习惯,第一,任何可配置的参数或变量都要写到一个config文件中。第二,代码中一定要有日志记录和完善的报错并记录报错。言归正传,swoole应该是每个phper必须要了解的,它号称重新定义了php。此聊天室利用了swoole高并发并且异步非阻塞的特点提高了程序的性能。

首先,定义一个 swoole_lock 和 swoole_websocket_server ,并且配置参数,具体参数详情可以去swoole官网查看。

public function start()
{
$this->lock = new swoole_lock(SWOOLE_MUTEX);            // 对文件或数组进行锁操作,已达到同步
$this->server = new swoole_websocket_server($this->addr, $this->port);  // swoole提供的Websocket Server
$this->server->set(array(
'daemonize' => ,
'worker_num' => ,
'task_worker_num' => ,
'max_request' => ,
'log_file' => ROOT_PATH . 'storage\\logs\\swoole.log' // swoole日志路径,必须是绝对路径
)); $this->server->on('open', array($this, 'onOpen'));
$this->server->on('message', array($this, 'onMessage'));
$this->server->on('task', array($this, 'onTask'));
$this->server->on('finish', array($this, 'onFinish'));
$this->server->on('close', array($this, 'onClose'));
   // 启动服务
$this->server->start();
}

当有客户端链接时,简单记录客户端的信息。

        public function onOpen($server, $request)
{
$message = array(
'remote_addr' => $request->server['remote_addr'],
'request_time' => date('Y-m-d H:i:s', $request->server['request_time'])
);
write_log($message);
}

当有客户端发送信息时,对信息进行处理。

        public function onMessage($server, $frame)
{
$data = json_decode($frame->data); switch ($data->type) {
case 'init':
case 'INIT':
$this->users[$frame->fd] = $data->message;  // 记录每个链接的信息,同样不要尝试打印出来看,因为你只能看到自己的链接信息
$message = '欢迎' . $data->message . '加入了聊天室';
$response = array(
'type' => , // 1代表系统消息,2代表用户聊天
'message' => $message
);
break;
case 'chat':
case 'CHAT':
$message = $data->message;
$response = array(
'type' => , // 1代表系统消息,2代表用户聊天
'username' => $this->users[$frame->fd],
'message' => $message
);
break;
default:
return false;
}
        
       // 将信息交给task处理
$this->server->task($response);
} public function onTask($server, $task_id, $from_id, $message)
{
       // 迭代所有的客户端链接,将消息推送过去。(如果你尝试将 $this->server->connections 打印出来,那么你会发现他是空的。但当时用 foreach 去循环时,它确实有用。)
foreach ($this->server->connections as $fd) {
$this->server->push($fd, json_encode($message));
}
$server->finish( 'Task' . $task_id . 'Finished' . PHP_EOL);
}

最后,当客户端断开链接时,利用锁机制,同步删除客户端信息,并记录日志。

        public function onClose($server, $fd)
{
$username = $this->users[$fd];
// 释放客户端,利用锁进行同步
$this->lock->lock();
unset($this->users[$fd]);
$this->lock->unlock(); if( $username ) {
$response = array(
'type' => , // 1代表系统消息,2代表用户聊天
'message' => $username . '离开了聊天室'
);
$this->server->task($response);
} write_log( $fd . ' disconnected');
}

服务端完了,下面就是客户端,很简单,只需要用websocket链接就ok!

        // websocket
let address = 'ws://<?php echo CLIENT_CONNECT_ADDR . ':' . CLIENT_CONNECT_PORT ?>';
let webSocket = new WebSocket(address);
webSocket.onerror = function (event) {
alert('服务器连接错误,请稍后重试');
};
webSocket.onopen = function (event) {
if(!sessionStorage.getItem('username')) {
setName();
}else {
username = sessionStorage.getItem('username')
webSocket.send(JSON.stringify({
'message': username,
'type': 'init'
}));
}
};
webSocket.onmessage = function (event) {
console.log(event);
let data = JSON.parse(event.data);
if (data.type == ) {
$('#chat-list2').append('<li class="ui-border-tb"><span class="username">系统消息:</span><span class="message">' + data.message + '</span></li>');
} else if (data.type == ) {
$('#chat-list2').append('<li class="ui-border-tb"><span class="username">' + data.username + ':</span><span class="message">' + data.message + '</span></li>');
} };
webSocket.onclose = function (event) {
alert('散了吧,服务器都关了');
};

详细代码可以去我的github下载

用swoole和websocket开发简单聊天室的更多相关文章

  1. Java和WebSocket开发网页聊天室

    小编心语:咳咳咳,今天又是聊天室,到现在为止小编已经分享了不下两个了,这一次跟之前的又不大相同,这一次是网页聊天室,具体怎么着,还请各位看官往下看~ Java和WebSocket开发网页聊天室 一.项 ...

  2. Netty 系列八(基于 WebSocket 的简单聊天室).

    一.前言 之前写过一篇 Spring 集成 WebSocket 协议的文章 —— Spring消息之WebSocket ,所以对于 WebSocket 协议的介绍就不多说了,可以参考这篇文章.这里只做 ...

  3. Flask基于websocket的简单聊天室

    1.安装gevent-websocket pip install -i https://pypi.tuna.tsinghua.edu.cn/simple/ gevent-websocket 2.cha ...

  4. 使用go,基于martini,和websocket开发简易聊天室

    一.首先,需要了解一下websocket基本原理:here 二.go语言的websocket实现: 基于go语言的websocket也有不少,比如github.com/gorilla/websocke ...

  5. workerman-chat(PHP开发的基于Websocket协议的聊天室框架)(thinkphp也是支持socket聊天的)

    workerman-chat(PHP开发的基于Websocket协议的聊天室框架)(thinkphp也是支持socket聊天的) 一.总结 1.下面链接里面还有一个来聊的php聊天室源码可以学习 2. ...

  6. swoole中websoket创建在线聊天室(php)

    swoole中websoket创建在线聊天室(php) swoole现仅支持Linix,macos 创建websocket服务器 首先现在服务器创建一个websocket服务器 <?php // ...

  7. 分享基于 websocket 网页端聊天室

    博客地址:https://ainyi.com/67 有一个月没有写博客了,也是因为年前需求多.回家过春节的原因,现在返回北京的第二天,想想,应该也要分享技术专题的博客了!! 主题 基于 websock ...

  8. SpringBoot 搭建简单聊天室

    SpringBoot 搭建简单聊天室(queue 点对点) 1.引用 SpringBoot 搭建 WebSocket 链接 https://www.cnblogs.com/yi1036943655/p ...

  9. 基于Node.js + WebSocket 的简易聊天室

    代码地址如下:http://www.demodashi.com/demo/13282.html Node.js聊天室运行说明 Node.js的本质就是运行在服务端的JavaScript.Node.js ...

随机推荐

  1. SSM框架+slf4j 以Gradle实现

    环境:win10+jdk8+tomcat9+Intellij IDEA 首先,作为一个喜欢偷懒的人,管理jar之类的的事情太累,所以用了Gradle项目管理器 第一步: 新建一个gradle-web项 ...

  2. ASP.NET Core 开源GitServer 实现自己的GitHub

    ASP.NET Core 2.0 开源Git HTTP Server,实现类似 GitHub.GitLab. GitHub:https://github.com/linezero/GitServer ...

  3. Go语言之三驾马车

    作者:唐郑望,腾讯后台开发 工程师商业转载请联系腾讯WeTest获得授权,非商业转载请注明出处.  WeTest 导读 Go语言的三个核心设计: interface | goroutine | cha ...

  4. 一、JAVA环境变量配置详解——JavaWeb点滴

    JAVA环境变量JAVA_HOME.CLASSPATH.PATH设置详解 Windows下JAVA用到的环境变量主要有3个,JAVA_HOME.CLASSPATH.PATH. JAVA_HOME 指向 ...

  5. 使用chart和echarts制作图表

      前  言 chart.js是一个简单.面向对象.为设计者和开发者准备的图表绘制工具库.它可以帮你用不同的方式让你的数据变得可视化.每种类型的图表都有动画效果,并且看上去非常棒,即便是在retina ...

  6. Scala从入门到精通之四-映射和元组

    在Scala中映射之键值对的集合,元组是n个对象的聚集,但是对象的类型不一定相同 本节内容要点 Scala中映射的创建,遍历和查询 如何从可变和不可变映射中做出选择 Scala映射和Java映射见的互 ...

  7. js图片延迟加载如何实现

      这里延迟加载的意思是,拖动滚动条时,在图片出现在浏览器显示区域后才加载显示. 大概的实现方式是: 在页面的load没有触发之前,把所有的指定id的元素内的img放入到imgs中,将所有的图片的sr ...

  8. copy11

    方法二 这种方法也比较简单,主要针对你没有.apk包的情况,比如Android原生自带的APP(计算器.通讯录.短信...),可以通过adb 命令. 1,打开APP. 2,执行> adb log ...

  9. 再学习之MyBatis

    一.框架基本介绍 1.概念 支持普通SQL查询.存储过程和高级映射,简化和实现了Java 数据持久化层的的开源框架,主要流行的原因在于他的简单性和易使用性. 2.特点 持久层 .ORM(对象关系映射) ...

  10. UWP Composition API - RadialMenu

    用Windows 8.1的童鞋应该知道OneNote里面有一个RadialMenu.如下图,下图是WIn10应用Drawboard PDF的RadialMenu,Win8.1的机器不好找了.哈哈,由于 ...