服务端
创建chatserver.php 文件
<?php
class Chat
{
const HOST = '0.0.0.0';//ip地址 0.0.0.0代表接受所有ip的访问
const PART = 81;//端口号
private $server = null;//单例存放websocket_server对象
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' => '/data/web/chat/public',//这里传入静态文件的目录
'enable_static_handler' => true//允许访问静态文件
]);
//开启服务
$this->server->start();
}
/**
* 连接成功回调函数
* @param $server
* @param $request
*/
public function onOpen($server, $request)
{
echo $request->fd . '连接了' . PHP_EOL;//打印到我们终端
}
/**
* 接收到信息的回调函数
* @param $server
* @param $frame
*/
public function onMessage($server, $frame)
{
/**
* TCP连接迭代器,可以使用foreach遍历服务器当前所有的连接,此属性的功能与swoole_server->connnection_list是一致的,但是更加友好。遍历的元素为单个连接的fd
*
* 连接迭代器依赖pcre库,未安装pcre库无法使用此功能
*
* foreach($server->connections as $fd)
* {
* $server->send($fd, "hello");
* }
*
* echo "当前服务器共有 ".count($server->connections). " 个连接\n";
*
* @var \Swoole\Connection\Iterator
*/
echo $frame->fd . '来了,说:' . $frame->data . PHP_EOL;//打印到我们终端
foreach ($server->connections as $fd) {//遍历TCP连接迭代器,拿到每个在线的客户端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;//打印到我们终端
}
}
$obj = new Chat();
?>
客户端
创建liaotian.html文件
<!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://20.20.24.131:81';
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>
启动服务端
php chatserver.php
浏览器中访问聊天室
http://20.20.24.131/chat/liaotian.html
点击链接,可以看到页面显示连接成功
打开服务端,可以看到
表示连接成功
输入奇葩天地网 点击发送
服务端,可以看到收到了客户端的聊天内容
客户端,点击断开
服务端,可以看到 客户端1,走了