您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

如何用swoole与websocket开发一个聊天室

2024/3/4 1:42:24发布24次查看
这次给大家带来如何用swoole与websocket开发一个聊天室,用swoole与websocket开发聊天室的注意事项有哪些,下面就是实战案例,一起来看一下。
首先,我想说下写代码的一些习惯,第一,任何可配置的参数或变量都要写到一个config文件中。第二,代码中一定要有日志记录和完善的报错并记录报错。言归正传,swoole应该是每个phper必须要了解的,它号称重新定义了php。此聊天室利用了swoole高并发并且异步非阻塞的特点提高了程序的性能。
首先,定义一个 swoole_lock 和 swoole_websocket_server ,并且配置参数,具体参数详情可以去swoole官网查看。
public function start() {    $this->lock = new swoole_lock(swoole_mutex);                // 对文件或数组进行锁操作,已达到同步    $this->server = new swoole_websocket_server($this->addr, $this->port);      // swoole提供的websocket server    $this->server->set(array(       'daemonize' => 0,       'worker_num' => 4,       'task_worker_num' => 10,       'max_request' => 1000,       'log_file' => root_path . 'storage\\logs\\swoole.log'        // swoole日志路径,必须是绝对路径    ));    $this->server->on('open', array($this, 'onopen'));    $this->server->on('message', array($this, 'onmessage'));    $this->server->on('task', array($this, 'ontask'));    $this->server->on('finish', array($this, 'onfinish'));    $this->server->on('close', array($this, 'onclose'));    // 启动服务    $this->server->start(); }
当有客户端链接时,简单记录客户端的信息。
public function onopen($server, $request)     {       $message = array(         'remote_addr' => $request->server['remote_addr'],         'request_time' => date('y-m-d h:i:s', $request->server['request_time'])       );       write_log($message);     }
当有客户端发送信息时,对信息进行处理。
public function onmessage($server, $frame)     {       $data = json_decode($frame->data);       switch ($data->type) {         case 'init':         case 'init':           $this->users[$frame->fd] = $data->message;  、       // 记录每个链接的信息,同样不要尝试打印出来看,因为你只能看到自己的链接信息           $message = '欢迎' . $data->message . '加入了聊天室';           $response = array(             'type' => 1,  // 1代表系统消息,2代表用户聊天             'message' => $message           );           break;         case 'chat':         case 'chat':           $message = $data->message;           $response = array(             'type' => 2,  // 1代表系统消息,2代表用户聊天             'username' => $this->users[$frame->fd],             'message' => $message           );           break;         default:           return false;       }                 // 将信息交给task处理       $this->server->task($response);     }     public function ontask($server, $task_id, $from_id, $message)     {        // 迭代所有的客户端链接,将消息推送过去。(如果你尝试将 $this->server->connections 打印出来,那么你会发现他是空的。但当时用 foreach 去循环时,它确实有用。)       foreach ($this->server->connections as $fd) {         $this->server->push($fd, json_encode($message));       }       $server->finish( 'task' . $task_id . 'finished' . php_eol);     }
最后,当客户端断开链接时,利用锁机制,同步删除客户端信息,并记录日志。
public function onclose($server, $fd)     {       $username = $this->users[$fd];       // 释放客户端,利用锁进行同步       $this->lock->lock();       unset($this->users[$fd]);       $this->lock->unlock();       if( $username ) {         $response = array(           'type' => 1,  // 1代表系统消息,2代表用户聊天           'message' => $username . '离开了聊天室'         );         $this->server->task($response);       }       write_log( $fd . ' disconnected');     }
服务端完了,下面就是客户端,很简单,只需要用websocket链接就ok!
// websocket     let address = 'ws://<?php echo client_connect_addr . ':' . client_connect_port ?>';     let websocket = new websocket(address);     websocket.onerror = function (event) {       alert('服务器连接错误,请稍后重试');     };     websocket.onopen = function (event) {       if(!sessionstorage.getitem('username')) {         setname();       }else {         username = sessionstorage.getitem('username')         websocket.send(json.stringify({           'message': username,           'type': 'init'         }));       }     };     websocket.onmessage = function (event) {       console.log(event);       let data = json.parse(event.data);       if (data.type == 1) {         $('#chat-list2').append('<li class="ui-border-tb"><span class="username">系统消息:</span><span class="message">' + data.message + '</span></li>');       } else if (data.type == 2) {         $('#chat-list2').append('<li class="ui-border-tb"><span class="username">' + data.username + ':</span><span class="message">' + data.message + '</span></li>');       }     };     websocket.onclose = function (event) {       alert('散了吧,服务器都关了');     };
相信看了本文案例你已经掌握了方法,更多精彩请关注其它相关文章!
推荐阅读:
在php中怎样实现微信退款功能
php有哪些生成随机数的方法
以上就是如何用swoole与websocket开发一个聊天室的详细内容。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product