首先,我想说下写代码的一些习惯,第一,任何可配置的参数或变量都要写到一个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. 实验排队功能实现(JAVA)

    1.功能要求 实验室有固定台数的设备供学生通过网络连接进行实验,一台设备只能同时被一个用户使用,一个用户只能占用一台设备. 下面是一个功能的简图: 2.实现方案 2.1 初始化 在项目启动之后,开始进 ...

  2. 关于docker使用的几个小问题(一)

    由于刚接触docker踩了几个坑,希望本文对网瘾少年有所帮助. Docker分CE版(社区版)和EE版(商用版),具体安装流程参考文档介绍,在此不再赘述.下面分Windows和Linux分别踩坑: 一 ...

  3. 使用angular4和asp.net core 2 web api做个练习项目(一)

    这是一篇学习笔记. angular 5 正式版都快出了, 不过主要是性能升级. 我认为angular 4还是很适合企业的, 就像.net一样. 我用的是windows 10 安装工具: git for ...

  4. SrpingDruid数据源加密数据库密码

    前言 在工作中遇到这样一个问题:开发过程中将数据库的账号.密码等信息配置在了一个单独的properties配置文件中(使用明文).但运维人员要求在配置文件中的密码一律不得出现明文. 环境 Spring ...

  5. iOS 之 protocol的相关问题

    定义一个协议, 一个协议可以扩展子另一个协议 如果需要扩展多个协议中间使用逗号分隔 //定义一个协议 @protocol AnimalDelegate <NSObject, ***> @r ...

  6. Element ui表格展示图片问题

    当需要遍历图片时,不能直接使用prop绑定值,具体 代码如下 <el-table-column label="头像" width="100"> &l ...

  7. Python 抽象篇:面向对象之类的方法与属性

    概览:类成员之字段:-普通字段,保存在对象中,执行职能通过对象访问-静态字段,保存在类中,执行可以通过对象访问,也可以通过类访问类成员之方法:-普通方法,保存在类中,由对象来调用,self->对 ...

  8. 通过命令行使用cl.exe编译器

    转载http://www.cnblogs.com/mizhongqin/archive/2013/03/11/cmd_cl-exe_vs2010.html 与在IDE中编译相比,命令行模式编译速度更快 ...

  9. 自定义Base16加密

                                                                                              自定义Base16加 ...

  10. JavaScript系列-----对象基于哈希存储(<Key,Value>之Value篇) (3)

    JavaScript系列-----Objectj基于哈希存储<Key,Value>之Value 1.问题提出 在JavaScript系列-----Object之基于Hash<Key, ...