最近回顾swoole,突然想试一个,直接上效果图and代码
图
swoole代码
用的官方示例改的
```ws.php
<?php
//创建WebSocket Server对象,监听0.0.0.0:9502端口
$ws = new Swoole\WebSocket\Server('0.0.0.0', 9502);
//监听WebSocket连接打开事件
$ws->on('Open', function ($ws, $request) {
$account = $request->get['account'];
$fd = $request->fd;
//直接用文件了,就不去创建数据库了
$acclist = json_decode(file_get_contents('/home/cyd/swoole/ws/acc.json'),true);
$acclist[$request->fd] = $account;
file_put_contents('/home/cyd/swoole/ws/acc.json',json_encode($acclist));
$ws->push($request->fd, "hello, welcome\n");
});
//监听WebSocket消息事件
$ws->on('Message', function ($ws, $frame) {
$msg_data = json_decode($frame->data,true);
//直接用文件了,就不去创建数据库了
$acclist = json_decode(file_get_contents('/home/cyd/swoole/ws/acc.json'),true);
$acclist2 = array_flip($acclist);
if(!$acclist2[$msg_data['to']]){
$ws->push($frame->fd, "用户不存在");
}else{
$ws->push($acclist2[$msg_data['to']], $msg_data['msg']);
}
});
//监听WebSocket连接关闭事件
$ws->on('Close', function ($ws, $fd) {
//退出删掉fd标识
$acclist = json_decode(file_get_contents('/home/cyd/swoole/ws/acc.json'),true);
unset($acclist[$fd]);
file_put_contents('/home/cyd/swoole/ws/acc.json',json_encode($acclist));
echo "client-{$fd} is closed\n";
});
$ws->start();
``HTML代码WS
<html>
<head>
<title>swoole sockte聊天</title>
</head>
<body>
<div id="room"></div>
<!--<p>你的<input type="text" id="account"/></p>-->
<p>to<input type="text" id="to"/></p>
<p>内容<input type="text" id="msg"/></p>
<p><input type="button" id="send" value="send"/></p>
<script type="text/javascript">
function $(str){
return document.getElementById(str);
}
// let account = $('account');
let to = $('to');
let msg = $('msg');
let room = $('room');
let send = $('send');
let ws = new WebSocket('ws://192.168.0.147:9502'+window.location.search);
ws.onopen = function(){
room.innerHTML = 'swoole连接上<br/>';
}
ws.onmessage = function(e){
room.innerHTML += e.data+'<br/>';
}
send.onclick = function(){
ws.send(`{"msg":"${msg.value}","to":"${to.value}"}`);
}
</script>
</body>
</html>
运行
- php ws.php
- 打开html文件传值?account=cydxin,直接ws连接的时候把用户传过去
补充
- 本来很简单的东西,还写了一会,主要是犯病了,定义json的时候,
ws.send(
{“msg”:“ m s g . v a l u e " , " t o " : " {msg.value}","to":" msg.value","to":"{to.value}”});
- value忘了上双引号,结果导致传数字是没问题的,传字符就噶了,哈哈哈哈
- 补充完整的地方就是登录了,可以套个登录上cookie,就不用在WS连接上写,swoole里边的话,上个数据库,反正壳子就是这样了,发消息,发给谁