摘要:一效果图二目录结构存放图片文件数据库操作类数据库配置文件创建协议文件聊天首页登录页面数据库文件三数据库结构四代码部分数据库配置文件数据库操作类
一、效果图
二、目录结构
images : 存放图片
js : js文件
swoole
|----action.php 数据库操作类 |----config.php 数据库配置文件 |----websocket.php swoole创建websocket协议文件
index.php : 聊天首页
login.html : 登录页面
webqq.sql : SQL数据库文件
三、数据库结构
四、代码部分
4.1、config.php 数据库配置文件
"127.0.0.1", "user"=>"root", "password"=>"4f54dd", "port"=>3306, "database"=>"webqq", "charset"=>"utf8" );
4.2、action.php数据库操作类
conn = mysqli_connect($database["host"],$database["user"],$database["password"],$database["database"]) or die ("Connect mysql failed ~~".mysqli_connect_error()); } //login public function login($nickname,$username,$password) { session_start(); $sql = " select `id` from `users` where `username` = "{$username}" "; if($query = $this->conn->query($sql)) { $row = mysqli_fetch_assoc($query); $now = date("Y-m-d H:i:s"); if($row["id"]) { $sql = " update `users` set `nickname` = "{$nickname}" , `username` = "{$username}" ,`password` = md5("{$password}") , `login_time` = "{$now}" , `login_num` = (`login_num` + 1) where `id` = {$row["id"]} "; } else { $sql = " insert into `users` (`nickname`,`username`,`password`,`login_time`,`login_num`) values ("{$nickname}" , "{$username}" , md5("{$password}") , "{$now}" ,"1")"; } $this->conn->query($sql); $user_id = $this->conn->insert_id; $_SESSION["uid"] = $row["id"] ? $row["id"] : $user_id; $_SESSION["nickname"] = $nickname; return 1; } else { return 0; } } //add friend public function addFriend($from_uid,$to_uid) { $sql = " select * from `friend` where `from_uid` = "{$from_uid}" and `to_uid` = "{$to_uid}" "; if($query = $this->conn->query($sql)) { $is_friend = mysqli_fetch_assoc($query); if(!$is_friend["to_uid"]){ if($from_uid == $to_uid) { return 2; } else { $sql = " select `nickname` from `users` where `id` = "{$to_uid}" "; $query = $this->conn->query($sql); $ret = mysqli_fetch_assoc($query); $nickname = $ret["nickname"]; if($nickname){ $sql = " insert into `friend` (`from_uid`,`to_uid`,`nickname`) values ("{$from_uid}","{$to_uid}","{$nickname}") "; $this->conn->query($sql); return array("to_uid"=>$to_uid,"nickname"=>$nickname); } else { return 3; } } } else { return 4; } } else { return 0; } } //friend lists public function friendLists($from_uid) { $sql = " select `id`,`nickname` from `users` where `id` != "{$from_uid}" "; if($query = $this->conn->query($sql)) { $lists = []; while ($row = mysqli_fetch_assoc($query)) { $sql_1 = " select `fd` from `fd_tmp` where `uid` = "{$row["id"]}" "; $query_1 = $this->conn->query($sql_1); $ret = mysqli_fetch_assoc($query_1); $row["status"] = $ret["fd"] ? "online" : "offline" ; $lists[] = $row; } return $lists; } else { return 0; } } //load history message public function loadHistory($from_uid,$to_uid) { $sql = " select `from_uid`,`to_uid`,`message`,`send_time` from `chat` where ( (`from_uid` = "{$from_uid}" and `to_uid` = "{$to_uid}") or (`to_uid` = "{$from_uid}" and `from_uid` = "{$to_uid}") ) order by `send_time` desc"; if($query = $this->conn->query($sql)) { $message = []; while ($row = mysqli_fetch_assoc($query)) { $message[] = $row; } return $message; } else { return 0; } } //send message public function sendMessage($from_uid,$to_uid,$message) { $time = date("Y-m-d H:i:s"); $sql = " insert into `chat` (`from_uid`,`to_uid`,`message`,`send_time`) values ("{$from_uid}","{$to_uid}","{$message}","{$time}") "; if($query = $this->conn->query($sql)) { $last_id = $this->conn->insert_id; return $last_id; } else { return 0; } } //get fd public function getFd($uid) { $sql = " select `fd` from `fd_tmp` where `uid` = "{$uid}" "; if($query = $this->conn->query($sql)) { $row = mysqli_fetch_assoc($query); return $row["fd"] ? $row["fd"] : 0; } else { return 0; } } //bind fd public function bindFd($uid,$fd) { $sql = " insert into `fd_tmp` (`fd`,`uid`) values ("{$fd}","{$uid}") "; if($this->conn->query($sql)) { return $fd; } else { return 0; } } //unbind fd public function unbindFd($fd) { $sql = " delete from `fd_tmp` where `fd` = "{$fd}" "; if($this->conn->query($sql)) { return 1; } else { return 0; } } public function __destruct() { mysqli_close($this->conn); } } //process ajax request if($_POST && isset($_POST["typ"])) { $action = new Action(); switch ($_POST["typ"]) { case "login": $ret = $action->login($_POST["nickname"],$_POST["username"],$_POST["password"]); break; case "addFriend": $ret = $action->addFriend($_POST["from_uid"],$_POST["to_uid"]); break; case "friendLists": $ret = $action->friendLists($_POST["from_uid"]); break; case "loadHistory": $ret = $action->loadHistory($_POST["from_uid"],$_POST["to_uid"]); break; case "sendMessage": $ret = $action->sendMessage($_POST["from_uid"],$_POST["to_uid"],$_POST["message"]); break; } echo json_encode(array("data"=>$ret)); }
4.3、websocket.php文件
action = new action(); $this->serv = new swoole_websocket_server("0.0.0.0",9502); $this->serv->on("open",array($this,"onOpen")); $this->serv->on("message",array($this,"onMessage")); $this->serv->on("close",array($this,"onClose")); $this->serv->start(); } public function onOpen($server,$request) { echo "Welcome {$request->fd} "; } public function onMessage($server,$request) { $data = json_decode($request->data); $from_uid = $data->from_uid; $to_uid = $data->to_uid; $message = $data->message; $this->action->unbindFd($from_uid); $from_fd = $this->action->bindFd($from_uid,$request->fd); if($from_fd) { $to_fd = $this->action->getFd($to_uid); if($to_fd) { $server->push($to_fd,$message); } } else { $server->push($request->fd,"bind from_fd failed ~~"); } } public function onClose($server,$fd) { $this->action->unbindFd($fd); echo "Goodbye {$fd} "; } }
4.4、index.php首页聊天文件
window.location.href="login.html";"; } ?>webqq----swoole
好友列表
正在与..... 聊天 关闭
4.5、login.html 登录文件
webqq----swoole
4.6、webqq.sql 数据结构文件
-- Adminer 4.1.0 MySQL dump SET NAMES utf8; SET time_zone = "+00:00"; SET foreign_key_checks = 0; SET sql_mode = "NO_AUTO_VALUE_ON_ZERO"; DROP TABLE IF EXISTS `chat`; CREATE TABLE `chat` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT "ID", `from_uid` int(10) unsigned NOT NULL, `to_uid` int(10) unsigned NOT NULL, `message` varchar(255) COLLATE utf8_unicode_ci NOT NULL, `send_time` timestamp NOT NULL DEFAULT "0000-00-00 00:00:00" ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; DROP TABLE IF EXISTS `fd_tmp`; CREATE TABLE `fd_tmp` ( `fd` int(10) unsigned NOT NULL, `uid` int(10) unsigned NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT="FD值与用户ID绑定"; DROP TABLE IF EXISTS `friend`; CREATE TABLE `friend` ( `from_uid` int(10) unsigned DEFAULT NULL, `to_uid` int(10) unsigned NOT NULL, `nickname` varchar(45) COLLATE utf8_unicode_ci NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT="好友列表"; DROP TABLE IF EXISTS `users`; CREATE TABLE `users` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT "ID", `nickname` varchar(45) COLLATE utf8_unicode_ci NOT NULL COMMENT "昵称", `username` varchar(45) COLLATE utf8_unicode_ci NOT NULL COMMENT "登陆名称", `password` char(32) COLLATE utf8_unicode_ci NOT NULL COMMENT "登陆密码", `login_time` datetime NOT NULL COMMENT "最后登陆时间", `login_num` int(10) unsigned DEFAULT "0" COMMENT "登陆次数", PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT="用户列表"; -- 2018-03-27 10:05:35
4.7、服务器环境centos7 + mariadb + swoole + apache + php7
注意事项:须安装swoole扩展,Linux服务器,PHP7+版本以上
进行项目根目录使用: php websocket.php 执行该文件
源码下载地址:https://pan.baidu.com/s/1sWY-...
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/28480.html
摘要:的异步并行高性能网络通信引擎,使用纯语言编写,提供了语言的异步多线程服务器,异步网络客户端,异步,异步,数据库连接池,,消息队列,毫秒定时器,异步文件读写,异步查询。内置了服务器端客户端服务器端。 swoole :http://www.swoole.com/PHP的异步、并行、高性能网络通信引擎,使用纯C语言编写,提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户端,异步M...
摘要:一阅前热身为了更加形象的说明同步异步阻塞非阻塞,我们以小明去买奶茶为例。等奶茶做好了,店员喊一声小明,奶茶好了,然后小明去取奶茶。将响应结果发给相应的连接请求处理完成因为基于,所以每个可以处理无数个连接请求。如此,就轻松的处理了高并发。 一、阅前热身 为了更加形象的说明同步异步、阻塞非阻塞,我们以小明去买奶茶为例。 1、同步与异步 ①同步与异步的理解 同步与异步的重点在消息通知的方式上...
摘要:一阅前热身为了更加形象的说明同步异步阻塞非阻塞,我们以小明去买奶茶为例。等奶茶做好了,店员喊一声小明,奶茶好了,然后小明去取奶茶。将响应结果发给相应的连接请求处理完成因为基于,所以每个可以处理无数个连接请求。如此,就轻松的处理了高并发。 一、阅前热身 为了更加形象的说明同步异步、阻塞非阻塞,我们以小明去买奶茶为例。 1、同步与异步 ①同步与异步的理解 同步与异步的重点在消息通知的方式上...
阅读 2708·2021-11-22 15:22
阅读 1608·2021-11-22 14:56
阅读 3593·2021-09-22 15:12
阅读 2383·2021-09-02 15:41
阅读 2102·2021-08-27 16:26
阅读 1089·2019-08-30 15:55
阅读 2116·2019-08-29 17:30
阅读 629·2019-08-29 16:26