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

swoole现仅支持Linix,macos

创建websocket服务器

首先现在服务器创建一个websocket服务器

<?php
//创建websocket服务器
$server = new Swoole\WebSocket\Server("0.0.0.0", 6060); // 当WebSocket客户端与服务器建立连接并完成握手后会回调此函数
$server->on('open', function (Swoole\WebSocket\Server $server, Swoole\Http\Request $request) { }); // 服务器主动向客户端发送数据
$server->on('message', function (Swoole\WebSocket\Server $server, swoole_websocket_frame $frame) {
$data = $frame->data;
$ret['data'] = $data; //广播群发
foreach ($server->connections as $client) {
//判断客户端是否自己
if ($frame->fd == $client) {
$ret['style'] = 'bubble me';
} else {
$ret['style'] = 'bubble you';
}
@$server->push($client, json_encode($ret, 256));
}
}); // 客户端关闭连接时触发此回调函数
$server->on('close', function ($ser, $fd) { });
// 启动服务
$server->start();

html页面

创建一个简单可用的swoole聊天室

<!DOCTYPE html>
<html lang="en"> <head>
<meta charset="UTF-8">
<title>在线聊天室</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="css/reset.min.css">
<link rel="stylesheet" href="css/style.css">
</head> <body>
<div class="wrapper">
<div class="container">
<div class="left">
<div class="top"> 在线人员</div>
<ul class="people">
<li class="person" data-chat="person1">
<img src="img/thomas.jpg" alt=""/>
<span class="name">张三</span>
<span class="time">10:09</span>
</li>
<li class="person" data-chat="person2">
<img src="img/dog.png" alt=""/>
<span class="name">李四</span>
<span class="time">10:44</span>
</li>
<li class="person" data-chat="person3">
<img src="img/louis-ck.jpeg" alt=""/>
<span class="name">王五</span>
<span class="time">10:50</span>
</li>
</ul>
</div>
<div class="right">
<div class="top"><span><span class="name">聊天室</span></span></div>
<div class="chat" data-chat="person2">
<template v-for="item in msglist">
<div :class="item.style">
{{ item.data }}
</div>
</template>
</div> <div class="write">
<input type="text" v-model="msg" placeholder="输入内容" @keydown.enter="send"/>
<!-- vue 修饰符 once prevent stop enter shift alt -->
<a @click.prevent="send" class="write-link send"></a>
</div>
</div>
</div>
</div>
<script src="js/index.js"></script>
<script src="js/vue.js"></script>
<script>
// 客户端连接websocket服务器端
const ws = new WebSocket('ws://175.24.114.149:6060');
// 事件监听
// 建议时事件
ws.onopen = () => {
console.log('连接建立')
};
// 接受消息事件
ws.onmessage = ({data}) => {
// 返回的是一个json字符串,json字符串转为对象 es6提供一个方法
let json = JSON.parse(data); // 使用vue提供变异方法
vm.msglist.push(json);
}; // 实例化 主组件中,data是用的对象非函数 子组件data用的是函数返回一个对象
const vm = new Vue({
el: '.wrapper',
data: {
msg: '',
// 消息列表
msglist: []
},
methods: {
// 发送消息事件
send() {
ws.send(this.msg);
this.msg = '';
}
}
});
</script>
</body>
</html>

最新文章

  1. 手机网页Html代码实现(解决显示页面很小的问题)
  2. 35.按要求编写Java程序: (1)编写一个接口:InterfaceA,只含有一个方法int method(int n); (2)编写一个类:ClassA来实现接口InterfaceA,实现int method(int n)接口方 法时,要求计算1到n的和; (3)编写另一个类:ClassB来实现接口InterfaceA,实现int method(int n)接口 方法时,要求计算n的阶乘(n
  3. jQuery 学习之路(3):DOM操作
  4. 51nod 1116 K进制下的大数 (暴力枚举)
  5. AS 自动生成选择器 SelectorChapek
  6. C++采用模板实现栈的方法
  7. jquery selector
  8. tomcat无法正常启动的一个原因
  9. Codeforces Round #364 (Div. 2) D. As Fast As Possible
  10. Hibernate一级缓存(基于查询分析)
  11. Ultimus BPM 制药与医疗行业应用解决方案
  12. golang实现dns域名解析(三):响应报文分析
  13. (1-2)SpringCloud:服务的消费者rest+ribbon
  14. linq分组求和_实体类和datatable
  15. 【线程系列五】什么时候释放锁—wait()、notify()
  16. 不可思议的纯 CSS 滚动进度条效果
  17. Android 控件
  18. SQL中IN与EXISTS的区别
  19. 第 1 篇 Scrum 冲刺博客
  20. 配置虚拟域名,hosts文件起作用

热门文章

  1. jmeter.墨振文档
  2. POI2009 KON-Ticket Inspector
  3. 在DLL中使用对话框
  4. 关于Android手机CPU不同架构的问题
  5. git基础使用(超级详细)
  6. Day1 字符串格式化
  7. Taro 3.1 beta 发布: 开放式架构新增 4 端支持
  8. 开发阶段,将SpringBoot应用快速部署到K8S
  9. 初级程序需要掌握的SQL(一)
  10. 让你轻松掌握 Python 中的 Hook 钩子函数