前言
贵有恒,何必三更起五更睡;最无益,只怕一日暴十寒。
偶然打开CSDN,忽然发现距离上一篇文章整整过去了一年。感慨时间过去飞快。这一年忙忙碌碌,但又没什么变化。一周一篇文章的约定,不知从哪天的忙碌开始抛到脑后。
裸辞后,休息了一个月,最近开始整理知识点。突然想起来要记录。那就坚持吧。不知道能坚持几天,但有开始总是好的。
实现思路
- 实现socket服务器。能连接、接受消息并作出回应、中断退出。
- 能对所有连接到服务器的客户端广播信息。
- 使用昵称聊天。
- 一对一聊天。
实现简单echo服务器
服务端代码实现
class Chat
{
const HOST = '0.0.0.0'; //允许所有ip的访问
const PART = 9501; //端口号
private $server = null; //服务对象
private $connectList = [];
public function __construct(){
$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->start();
}
/**
* 连接成功回调函数
* @param $server
* @param $request
*/
public function onOpen($server, $request)
{
echo $request->fd . '已连接' . PHP_EOL;//输出终端
$this->connectList[] = $request->fd; // 存储连接上的客户端
}
/**
* 接收到信息的回调函数
* @param $server
* @param $frame
* @return bool
*/
public function onMessage($server, $frame)
{
$data = $frame->data;
// 群发
echo $frame->fd . '说:' . $data . PHP_EOL;//打印到我们终端
//将这个用户的信息存入集合
foreach ($this->connectLis as $fd) {// 遍历客户端的集合
$server->push($fd, json_encode(['no' => $frame->fd , 'msg' => $data]));
}
}
/**
* 断开连接回调函数
* @param $server
* @param $fd
*/
public function onClose($server, $fd)
{
echo $fd . '断开连接' . PHP_EOL;//输出到终端终端
$this->connectList = array_diff($this->connectList, [$fd]); //移除断开连接的客户端
}
}
$obj = new Chat();
终端运行socket服务。 php test.php;
客户端代码实现
<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;">
=======聊天室==&