package process
import (
"char_room/common/message"
"char_room/server/model"
"char_room/server/utils"
"encoding/json"
"fmt"
"net"
)
type UserProcess struct {
Conn net.Conn
//增加一个字段表示该conn是哪个用户
UserId int
}
//通知所有用户在线
//userid通知其它的在线用户,我上线
func (this *UserProcess) NotifyOtheronlineUser(userId int) {
//遍历onlineUsers,然后一个一个的发送
for id, up := range userMgr.onlineUsers {
//过滤到自己
if id == userId {
continue
}
//开始通知
up.NotifyMeOnline(userId)
}
}
func (this *UserProcess) NotifyMeOnline(userId int) {
//组装NotifyUserStatusMes
var mes message.Message
mes.Type = message.NotifyUserStatusMesType
var notifyUserStatusMes message.NotifyUserStatusMes
notifyUserStatusMes.UserId = userId
notifyUserStatusMes.Status = message.UserOnline
//将notifyUserStatusMes序列化
data, err := json.Marshal(notifyUserStatusMes)
if err != nil {
fmt.Println("json marshal err=", err)
return
}
//将序列化后的notifyUserStatusMes赋值给mes.data
mes.Data = string(data)
data, err = json.Marshal(mes)
if err != nil {
fmt.Println("json marshal err=", err)
return
}
//发送,创建我们TransFer实例
tf := &utils.Transfer{
Conn: this.Conn,
Buf: [8096]byte{},
}
err = tf.WritePkg(data)
if err != nil {
fmt.Println("NotifyMeOnline err=", err)
return
}
}
func (this *UserProcess) ServerProcessRegister(mes *message.Message) (err error) {
//1.先从mes中取出mes.data,并直接反序列化成RegisterMes
var registerMes message.RegisterMes
err = json.Unmarshal([]byte(mes.Data), ®isterMes)
if err != nil {
fmt.Println("json.Unmarshal fail err=", err)
return
}
//1.先声明一个resMes
var resMes message.Message
resMes.Type = message.RegisterResMesType
//2.再声明一个registerResMes,并完成赋值
var registerResMes message.RegisterResMes
//需要到redis数据库完成注册
//1.使用model.MyUserDao 到redis验证
err = model.MyUserDao.Register(®isterMes.User)
if err != nil {
if err == model.ERROR_USER_EXISTS {
registerResMes.Code = 505
registerResMes.Error = model.ERROR_USER_EXISTS.Error()
} else {
registerResMes.Code = 506
registerResMes.Error = "注册发生未知错误..."
}
} else {
registerResMes.Code = 200
}
data, err := json.Marshal(registerResMes)
if err != nil {
fmt.Println("json.Marshal fail", err)
return
}
//4.将data赋值给resMes
resMes.Data = string(data)
//5.对resMes进行序列化,准备发送
data, err = json.Marshal(resMes)
if err != nil {
fmt.Println("json.Marshal fail", err)
return
}
//6.发送data,我们将其封装到writePkg函数
//因为使用分层模式(mvc),我们先创建一个Transfer实例,然后读取
tf := &utils.Transfer{
Conn: this.Conn,
Buf: [8096]byte{},
}
err = tf.WritePkg(data)
return
}
func (this *UserProcess) ServerProcessLogin(mes *message.Message) (err error) {
//1.先从mes中取出mes.data,并直接反序列化成LoginMes
var loginMes message.LoginMes
err = json.Unmarshal([]byte(mes.Data), &loginMes)
if err != nil {
fmt.Println("json.Unmarshal fail err=", err)
return
}
//1.先声明一个resMes
var resMes message.Message
resMes.Type = message.LoginResMesType
//2.再声明一个LoginResMes,并完成赋值
var loginResMes message.LoginResMes
//需要到redis数据库完成验证
//1.使用model.MyUserDao 到redis验证
user, err := model.MyUserDao.Login(loginMes.UserId, loginMes.UserPwd)
if err != nil {
if err == model.ERROR_USER_NOEXISTS {
loginResMes.Code = 500
loginResMes.Error = err.Error()
} else if err == model.ERROR_USER_PWD {
loginResMes.Code = 403
loginResMes.Error = err.Error()
} else {
loginResMes.Code = 505
loginResMes.Error = "服务器内部错误!"
}
} else {
loginResMes.Code = 200
//这里因为用户登录成功,因此可以把该登录成功的用户放入到userMgr中
//将登陆成功的userid赋给this
this.UserId = loginMes.UserId
userMgr.AddonlineUser(this)
this.NotifyOtheronlineUser(loginMes.UserId)
//将当前用户在线的id放入到loginResMes.UsersId
//遍历userMgr.onlineUsers
for id, _ := range userMgr.onlineUsers {
loginResMes.UserIds = append(loginResMes.UserIds, id)
}
fmt.Println(user, "登录成功")
}
////如果用户id=100,密码=123456,认为合法,否则不合法
//if loginMes.UserId==100&&loginMes.UserPwd=="123456" {
// //合法
// loginResMes.Code = 200
//}else {
// //不合法
// loginResMes.Code = 500 //500状态码表示用户不存在
// loginResMes.Error="饿货!用户不存在!请注册再使用..."
//}
//3.将loginResMes序列化
data, err := json.Marshal(loginResMes)
if err != nil {
fmt.Println("json.marshal fail", err)
return
}
//4.将data赋值给resMes
resMes.Data = string(data)
//5.对resMes进行序列化,准备发送
data, err = json.Marshal(resMes)
if err != nil {
fmt.Println("json.Marshal fail", err)
return
}
//6.发送data,我们将其封装到writePkg函数
//因为使用分层模式(mvc),我们先创建一个Transfer实例,然后读取
tf := &utils.Transfer{
Conn: this.Conn,
Buf: [8096]byte{},
}
err = tf.WritePkg(data)
return
}
九转成圣
- 粉丝: 6017
- 资源: 2959
最新资源
- DC-DC仿真之升压斩波电路BOOST电压电流双闭环PI控制入门指南:12V输入变24V输出,开关频率达20kHz电力电子基础学习教程,DC-DC仿真,升压斩波电路BOOST电压电流双闭环PI控制,输
- 永磁同步电机直接转矩控制仿真研究:高效功况波形解析,永磁同步电机传统直接转矩控制仿真,功况波形很好 ,永磁同步电机; 传统直接转矩控制; 仿真; 功况波形好; 控制系统性能; 高效性; 稳定性,"永磁
- 解决可饱和吸收镜问题,MATLAB分步傅里叶法仿真光纤激光器锁模脉冲产生过程,MATLAB分步傅里叶法仿真光纤激光器锁模脉冲产生 解决了可饱和吸收镜导致的脉冲漂移问题 ,核心关键词:MATLAB; 分
- 三相光伏发电并网系统研究:PLL锁相环、MPPT最大功率点跟踪及dq解耦控制策略下逆变器性能分析,光伏发电三相并网模型 光伏加+Boost+三相并网逆变器 PLL锁相环 MPPT最大功率点跟踪控制(扰
- 基于组态王和S7-200 PLC的锅炉温度控制系统设计详解:梯形图程序、接线图与组态画面全解析,No.1176 基于组态王和S7-200 PLC的锅炉温度控制系统设计 带解释的梯形图程序,接线图原理图
- 固体电介质电树枝击穿现象与SF6气体流注放电过程研究,固体电介质电树枝击穿,以及SF6气体,流注放电过程 ,核心关键词:固体电介质电树枝击穿; SF6气体; 流注放电过程 ,"固体电介质电树枝击穿机制
- 双向结构两相交错并联Buck-Boost变换器仿真研究:电流均流与多模式控制探索,两相交错并联buck boost变器仿真 采用双向结构,管子均为双向管 模型内包含开环,电压单环,电压电流双闭环三种控
- MATLAB 2018a环境下2D 3D局部边坡估计与结构滤波方法-含SNR计算和整合应用教程,MATLAB环境下2D 3D局部边坡估计和结构滤波方法 算法运行环境为matlab r2018a,执行
- 车辆三自由度运动学模型与预测控制:Carsim Simulink联合仿真及无人驾驶车辆分析资料,车辆三自由度运动学模型; Carsim Simulink联合仿真; 无人驾驶车辆模型预测控制(2.1)
- 基于单片机技术的八人数字抢答器仿真与程序设计报告:定时抢答,数码显示与蜂鸣报警功能,基于单片机八人数字抢答器仿真、程序、设计报告 (1)抢答器同时供 8 名选手比赛,分别用8个按钮 s1-s8表示 (
- 基于深度学习的YOLOv安全帽佩戴实时检测与目标追踪,可视化界面展示,yolov安全帽佩戴检测,目标检测,附带可视化界面 ,核心关键词:yolov安全帽佩戴检测; 目标检测; 可视化界面 ,"Yol
- 精准控制水泵运行:智能轮换切换,故障自动投入模式与压力加减调控系统结合应用,水泵控制程序,跟随压力加减机,定时轮,故障自动投入,水泵相互备用 1.模式为0,先停泵,然后启动水泵 2.模式为1, 先启泵
- 永磁同步旋转电机发电与蓄电池充电控制仿真模型研究:转速、电流双闭环控制及储能优化分析,永磁同步旋转电机发电给蓄电池充电控制仿真模型 联系本链接包括以下部分: 1. 仿真中含永磁同步发电机(PMSG)、
- 汇川伺服系列飞剪操作,细节详解与实际应用的指南包含触摸屏、PLC程序与参数设定,汇川伺服追剪飞锯,用的都是汇川系列,包含详细的注释、触摸屏程序、plc程序、伺服参数设置和图纸,已经在实际中应用 ,核
- 基于双向DC DC结构与双闭环控制策略的蓄电池三阶段充电仿真系统,参数可灵活调整,逻辑选择简易,适用于多种充电工况与算法改进,仿真采用双向DC DC结构以及电压电流双闭环控制策略,实现蓄电池三阶段充电
- MMC低频运行下的子模块电容电压波动抑制策略:高频正弦注入方法与混合注入法仿真研究,MMC运行于低频工况 采用 高频正弦注入方法 抑制子模块电容电压波动 模块化多电平变器 MATLAB2021b仿真
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈