workerman实现聊天室
现在我们就可以做一个聊天室,关键代码如下:
<?php /** * Created by PhpStorm. * User: John * Date: 2019/4/3 * Time: 13:19 */ use Workerman\Worker; require __DIR__.'/../Workerman-framework/Autoloader.php'; // 当客户端连上来时分配uid,并保存连接,并通知所有客户端 function handle_connection($connection) { } // 当客户端发送消息过来时,转发给所有人 function handle_message($connection, $data) { global $text_worker; foreach($text_worker->connections as $conn) { $conn->send($data); } } // 当客户端断开时,广播给所有客户端 function handle_close($connection) { } // 创建一个文本协议的Worker监听2347接口 $text_worker = new Worker("websocket://0.0.0.0:2347"); // 只启动1个进程,这样方便客户端之间传输数据 $text_worker->count = 1; $text_worker->onConnect = 'handle_connection'; $text_worker->onMessage = 'handle_message'; $text_worker->onClose = 'handle_close'; Worker::runAll();
前端代码如下
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <div style="margin: 0 auto;width: 800px"> <h2>聊天室</h2> <textarea type="text" style="border: 1px solid black;width: 800px;height: 200px;" id="his"></textarea> <input type="text" style="width:740px" id="sendMsg"> <button id="send">发送</button> </div> </body> </html> <script src="http://code.jquery.com/jquery-latest.js"></script> <script> $(function () { var ws = new WebSocket("ws://127.0.0.1:2347"); var storage = window.localStorage; if(!storage.getItem('name')){ var name=prompt("请输入您的名字",""); storage.setItem('name',name); } $('#send').click(function () { msg = $('#sendMsg').val(); $('#sendMsg').val(''); ws.send(storage.getItem('name')+':'+msg); }); ws.onopen = function() { $('#his').append("服务器连接成功....."); $('#his').append("\n"); }; ws.onmessage = function(e) { $('#his').append(e.data); $('#his').append("\n"); }; }); </script>
咱们这里使用了websocket协议,打开页面即建立一个连接;
解释下php代码
onConnet就是连接时完成三次握手时,执行的触发动作;$connection是连接对象;
onMessage是当客户端通过连接发来数据时(Workerman收到数据时)触发的回调函数;$data是客户端连接上发来的数据,如果Worker指定了协议,则$data是对应协议decode(解码)了的数据;$connection是连接对象
onClose当客户端连接与Workerman断开时触发的回调函数。不管连接是如何断开的,只要断开就会触发onClose
。每个连接只会触发一次onClose(注意:这里的断开指的是关闭浏览器,不是断网;断网的话需要做心跳检测来判断)