TP为最新版本;大致实现,用户注册,注册后跳转到登录页面;登录后生成一个身份令牌(token)并保存在Redis中;聊天界面没有ajax请求,只要有一个handshake一个http请求,我真的不理解有些人,聊天界面用ajax发消息,做一些处理,只有一个账号就可以了在一个浏览器中使用,所以测试后必须使用两个浏览器跳转到聊天界面,然后建立WebSocket握手,握手时携带toekn和对方ID(好友ID);后台服务器在OnOpen时进行一系列操作,如(检测token,检测好友ID,将自己的ID和fd更新到数据表,fd绑定uid等。);这些测试通过后,获取聊天记录,为了效率拉取15条与好友的聊天记录;发送的数据在OnMessage中获取!发送后查看对方是否在线。如果不在线,则无需发送给对方。如果对方在线,就把信息推送给他!心跳检测:每5秒检测一次,如果100秒内没有任何操作,则断开连接,同时清除数据库中的fd!代码很简单,,,但是有些问题没有解决,比如在线统计(连接数)下面贴上Socket_Server.php的代码,其他都是没有任何逻辑的代码!完成等写完请发出来,大家共同进步!4,//设置要启动的工作进程数'daemonize'=>false,//Daemonize.'backlog'=>128,//监听队列长度,'dispatch_mode'=>2,'heartbeat_check_interval'=>5,'heartbeat_idle_time'=>100,];publicfunctiononOpen(swoole_websocket_server$server,\swoole_http_request$req){$fd=$req->fd;$token=$req->get['token']??'';//获取客户端用户IDif(!$token){$server->push($fd,Tool::showAjax(['status'=>3,'message'=>'请先登录!']));$服务器->关闭($fd);返回;}$userData=Cache::get($token);if(!$userData){$server->push($fd,Tool::showAjax(['status'=>2,'message'=>'用户身份无效,请重新登录!']));$服务器->关闭($fd);返回;}self::$uid=$req->get['friendId'];如果(自我::$uid==$userData['uid']){$server->push($fd,Tool::showAjax(['status'=>2,'message'=>'非法操作!']));$服务器->关闭($fd);}$server->bind($fd,$userData['uid']);$messages=Message::getMessage($userData['uid']);(newUserModel())->where('id',$userData['uid'])->update(['fd'=>$req->fd]);$arr=$messages->toArray();排序($arr);$server->push($fd,Tool::showAjax(['status'=>1,'message'=>'success','data'=>$arr]));}publicfunctiononMessage(swoole_websocket_server$server,\swoole_websocket_frame$frame){$message=$frame->data;如果(空($message))返回;$data=['uid1'=>$server->getClientInfo($frame->fd)['uid'],'uid2'=>self::$uid,'message'=>htmlspecialchars($message),'send_uid'=>$server->getClientInfo($frame->fd)['uid']];尝试{(newMessage())->save($data);}catch(\Exception$e){$server->push($frame->fd,Tool::showAjax(['status'=>'2','message'=>'发送数据失败!']));}$messages=Message::getMessage($server->getClientInfo($frame->fd)['uid']);$friendData=UserModel::geUserDataFd(self::$uid);$arr=$messages->toArray();排序($arr);如果($friendData){$server->push($friendData,Tool::showAjax(['status'=>1,'message'=>'success','data'=>$arr]));}$server->push($frame->fd,Tool::showAjax(['status'=>1,'message'=>'success','data'=>$arr]));}functiononClose(\swoole_server$server,int$fd,int$reactorId){(newUserModel())->where('fd',$fd)->update(['fd'=>'']);}}
