userProcess.go

package process

import (
“encoding/json”
“fmt”
“net”
//沒有引入message包,和utils包與model包
)

type UserProcess struct {
//字段
Conn net.Conn
//增加一個字段,表示該Conn是哪個用戶的
UserId int
}
//這裏我們編寫通知所有在線的用戶的方法
//userId要通知其他的在線用戶,我上線
func(this *UserProcess)NotifyothersOnlineUser(userId int){
//遍歷onlineUsers,然後一個一個的發送NotifyotherStatusMes
for id,up:=range this.onlineUsers{
//過濾到自己
if id == userId{
continue
}
//開始通知[單獨的寫一個方法]
up.NotifyMeOnline(userId)
}
}
func(this *UserProcess)NotifyMeonline(userId int){
//組裝我們的NotifyUserStatusMes
var mes message.Message
mes.Type=message.NotifyUserStatusMes
notifyUserStatusmes.UsersId=userId
notifyUserStatusMes.Status=message.UserOnline

//將notifyUserStatusMes序列化
data,err:=json.Marshal(message.NotifyUserStatusMes)
if err!=nil{
	fmt.Println("json.Marshal err=",err)
	return
}
//將序列化後的notifyUserStatusMes賦值給mes.Data
mes.Data=string(data)
//對mes再次序列化,準備發送,
data,err=json.Marshal(mes)
if err!=nil {
	fmt.Println("json.Marshal err=", err)
	return
}
//發送,創建我們Transfer實例,發送
tf:=&utis.Transfer{
	Conn:this.Conn,
}

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),&registerMes)
if err!=nil{
fmt.Println(“json.Unmarshal fail err=”,err)
return
}
//1先聲明一個resMes
var resMes message.Message
resMes.Type=message.RegisterResMesType
//2在聲明一個LoginResMes,並完成賦值
var registerResMes message.RegisterResMes

//我們需要到redis數據庫去完註冊。
//1.使用model.MyUserDao 到redis去驗證
err=model.MyuserDao.Register(&registerMes,User)

if err!=nil{
	if err==ERROR_USER_EXISTS {
		registerMes.Code = 505
		registerMes.Error = model.ERROR_USER_EXISTS.Error()
	}else {
		registerMes.Code=506
		registerMes.Error="註冊發生未知錯誤...."

	}
}else {
	registerMes.Code=200
}
data,err:=json.Marshal(registerMes)
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 我們將其封裝到write
//因爲使用分層模式(mvc),我們先創建一個Transfer實例,然後讀取
tf:=&utils.Transfer{
	conn:this.Conn,
}
err=tf.writePkg(data)
return

}

//編寫一個函數ServerProcessLogin函數,專門處理登錄請求
func (this UserProcess)serverProcessLogin(conn net.Conn,mesmessage.Message)(err error){
//核心代碼
//1.先從mes中取出mes.Data,並直接反序列化成LoginMes
var loginMes Message.LoginMes
json.Unmarshal([]byte(mes.data),&loginMes)
if err!=nil{
fmt.Println(“json.Unmarshal fail err=”,err)
return
}

//我們需要到redis數據庫去完成驗證。
//1.使用model.MyUserDao 到redis去驗證
user,err:=model.MyuserDao.Login(loginResMes.UserId,loginMes.UserPwd)
if err!=nil{
	if err==moder.ERROR_USER_NOTEXTSTS{
		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.NotifyothersOnlineUser(loginMes.UserId)
	//將當前在線用戶的id放入到loginResMes.UsersId
	//遍歷userMgr.onlineUsers
	for id,_:=range userMgr.onlineUsers{
		loginMes.UsersId=append(loginResMes.UsersId,id)
	}


	fmt.Println(user,"登錄成功")
}
//如果用戶id=100,密碼=123456,認爲合法,否則不合法
//if loginMes.UserId==100&&loginMes.UserPwd=="123456"{
//
//	//合法
//	loginMes.Code=200
//
//}else{
//	//不合法
//	loginMes.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 我們將其封裝到write
//因爲使用分層模式(mvc),我們先創建一個Transfer實例,然後讀取
tf:=&utils.Transfer{
	conn:this.Conn,
}
err=tf.writePkg(data)
return

}
//編寫一個ServerProcessMes函數
//功能:根據客戶端發送消息種類不同,決定調用哪個函數來處理

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章