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
}
九转成圣
- 粉丝: 4113
- 资源: 2961
最新资源
- matlab代码 基于随机森林的数据分类,代码注释详细,数据可以随意更,只需替Excel文件,附运行视频
- 基于FPGA,通过IIC通信的EEPROM数据写入和读出实际工程案例
- fpga rgmii接口以太网,支持udp,icmp,arp等协议
- 一个实现MySQL协议的纯 node.js JavaScript 客户端 .rar
- 混合动力汽车基于规则的能量管理策略,结果如图,包含CRUISE整车模型,控制策略
- MATLAB环境下一种改进的变分模态分解方法 算法可迁移至金融时间序列,地震 微震信号,机械振动信号,声发射信号,电压 电流信号
- 基于C++猜数字大小游戏(完整代码+简介+c++教程攻略).docx
- 浮点数转换为16进制,C语言编写,方便移植
- FX3U的定位和气缸的FB块,没有密码,可以随便直接调用修改 写法新颖,思路清晰,是敩习FB块很好的范 例
- SameFileMarker 重复文件标记工具
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈