海量用户通讯系统-用户注册(1)|学习笔记

简介: 快速学习海量用户通讯系统-用户注册(1)

开发者学堂课程【Go 语言核心编程 - 面向对象、文件、单元测试、反射、TCP 编程:海量用户通讯系统-用户注册(1)】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/626/detail/9811


海量用户通讯系统-用户注册(1)

 

目录:

一、用户注册

二、代码实现

 

一、用户注册

实现功能完成注册用户

1)完成注册功能,将用户信息录入到Redis中

message.go

packagemessage

const(

LoginmesType"LoginMes"=

LoginResMesType"LoginResMes"

RegisterMesType"RegisterMes"

)

type Message struct {

Type string `json:"type"

//消息类型

Data string*json:"data"*

//消息的类型

//定义两个消息..后面需要再增加

type LoginMes struct {

UserId int `json:"userId"

//用户id

UserPwd string `json:"userPwd"*

//用户密码 UserName string `json:"userName""

//用户名

type LoginResMes struct {

Code int*json:"code"*

// 返回状态码500表示该用户未注册 200表示登录成功 Error string `json:"error""

// 返回错误信息

Error  String json :error

//返回错误信息

type Reristerhes struct {

User User

//类型就是User结构体。

}

Code int json: "code-"返回状态码400表示该用户已经占有200表示注册成功

Error string、'json:"error"

//返回错误信息

2)思路分析, 并完成代码

3)思路分析的示意图

经典项目-海量用户即时通讯系统

实现功能-完成用户登录

3)在Redis手 动添加测试用户,并画图+说明注意(后面通过程序注册用户)

4)如输入的用户名密码在RedJs中存在则登录,否则退出系统,相应的

提示信息:

1.用户不存在或密码错误

2.你也可以重新注册,再登录

user.go

package message

//定义一个用户的结构体

type User struct {

//确定字段信息

//为了序列化和反序列化成功,我们必须保证

//用户信息的json字符串的key 和 结构体的字段对应的 tag 名字一致!!! UserId int `json:"userid"

UserPwd string`json:"userPwd" UserName string `json:"userName"}

 

二、代码实现

main.go

godeichatroom Clnentiprocess

//定义两个变量,一个表示用户id,一个表示用户密码 var userid int

var userPwd string var userName string

func main() {

//接收用户的选择 var key int

//判断是否还继续显示菜单

//var loop = trde

userprocess.go

package process import(

"fmt""net"

"go_code/chatroom/common/message""go code/chatroom/client/utils""encoding/binary"

"encoding/json"

"os"

type UserProcess struct {

//暂时不需要字段..}

func(this *UserProcess)Register(userId int,

userPwd string, userName string)(err error){

//1.链接到服务器

conn, err := net.Dial("tcp","localhost:8889") if err != nil {

fmt.Println("net.Dial err=", err) return

//延时关闭

defer conn.close))

//2,准备通过conn发送消息给服务 var mes message.Message

mes.Type = message.RegisterMesType//3。创建一个LoginMes 结构体

var registerMes message.RegisterMes registerMes.User.UserId =userId registerMes.User.UserPwd =userPwd registerMes.User.UserName = userName

//4.将registerMes 序列化

data, err :=json.Marshal(registerMes) if err != nil {

fmt.Println("json.Marshal err=", err) return}

// 5.把data赋给 mes.Data字段 mes.Data = string(data)

//6.将 mes进行序列化化

data, err = json.Marshal(mes) if err != nil {

//将mes的Data部分反序列化成 RegisterresMes var registerResMes message.RegisterResMes

err =json.Unmarshal([]byte(mes.Data),®isterResMes) if registerResMes.Code == 200 {

fmt.Println("注册成功,你重新登录一把")

} else {

fmt.Println(registerResMes.Error)

os.Exit(0)

return I

//给关联一个用户登录的方法

//写一个函数,完成登录

func(this *UserProcess) Login(userId int, userPwd string)(err error){

//下一个就要开始定协议.

// fmt.Printf(" userId = %d userPwd=%s\n", userId, userPwd)for true {

fmt.Println("_ ...- ----欢迎登陆多人聊天系统------------"

fmt.Println("\t\t\t 1 登陆聊天室") fmt.Println("\t\t\t 2 注册用户") fmt.Println("\t\tlt3 退出系统") fmt.Println("\t\t\t 请选择(1-3):")

fmt.Scanf("%d\n",&key) switch key

case 1:

fmt.Println("登陆聊天室") fmt.Println("请输入用户的id

fmt.Println("请输入用户的id") fmt.Scanf("%d\n",&userId)

fmt.Println("请输入用户的密码") fmt.scanf("%s\n",&userPwd)

// 完成登录

//1、创建一个UserProcess的实例 up :=&process.UserProcess() up.Login(userId,userPwd) case 2 :

fmt.Println("注册用户")

fmt.Println("请输入用户id:") fmt.Scanf("%d\n",&userId)

fmt.Println("请输入用户密码:" fmt.Scanf("%s\n",&userPwd)

fmt.Println("请输入用户名字(nick):" fmt.scanf("%s\n",&userPwd) case 3 :

fmt.Println("退出系统")

//loop = false os.Exit(e) default :

fmt.Println("你的输入有误,请重新输入")

}

}

//更加用户的输入,

显示新的提示信息

//if key==1{

// / 说明用户要登陆

//fmt.Print1n("请输入用户的id")

7,到这个时候 data就是我们要发送的消息

7.1 先把 data的长度发送给服务器

// 先获取到 data的长度->转成一个表示长度的byte切片 var pkgLen uint32

pkgLen = uint32(len(data)) var buf [4]byte

binary.BigEndian.PutUint32(buf[e:4],pkgLen)

// 发送长度

n,err := conn.Write(buf[:4]) if n != 4 ll err != nil {

fmt.Println("conn.Write(bytes)fail", err) return}

fmt.Printf("客户端,发送消息的长度=%d内容=%s",len(data),string(data))

// 发送消息本身

err = conn.Write(data) if err != nil {

fmt.Println("conn.Write(data)fail",err) return}

//休眠20

time.Sleep(20. timesecond

//fnt.Print1n("休眠了20.")

//这里还需要处理服务器端返回的消息。

//创建一个Transfer 实例 tf:=&utils.Transfer{

Conn:conn,

mes, err =tf.ReadPkg()

//mes 就是

if err l= ni1 {

fmt.Println("readpkg(conn)err-", err) return}工

//将mes的Data部分反序列化成LoginresMes var loginResMes message.LoginResMes

err =json.Unmarshal([]byte(mes.Data),&loginResMes)

1先把user.go放入到common/message文件夹.

2. common/message/message.go新增加两个消息类型

3.在客户端接收用户的输入

4.在client/process/userProcess.go增加一个Register方法,完成请求注册

相关文章
|
网络协议 前端开发 测试技术
海量用户通讯系统——服务端结构改进1|学习笔记
快速学习海量用户通讯系统——服务端结构改进1
91 0
海量用户通讯系统——服务端结构改进1|学习笔记
|
NoSQL 网络协议 关系型数据库
海量用户通讯系统-完成界面|学习笔记
快速学习海量用户通讯系统-完成界面
138 0
海量用户通讯系统-完成界面|学习笔记
|
JSON 网络协议 测试技术
海量用户通讯系统-项目小结|学习笔记
快速学习海量用户通讯系统-项目小结
106 0
海量用户通讯系统-项目小结|学习笔记
|
网络协议 测试技术 Go
海量用户通讯系统-显示在线用户列表(1)|学习笔记
快速学习海量用户通讯系统-显示在线用户列表(1)
154 0
海量用户通讯系统-显示在线用户列表(1)|学习笔记
|
网络协议 测试技术 Go
海量用户通讯系统——客户端结构改进1|学习笔记
快速学习海量用户通讯系统——客户端结构改进1
85 0
海量用户通讯系统——客户端结构改进1|学习笔记
|
缓存 JSON 网络协议
海量用户系统-客户端结构改进2|学习笔记
快速学习海量用户系统-客户端结构改进2
90 0
海量用户系统-客户端结构改进2|学习笔记
|
NoSQL 网络协议 Oracle
海量用户即时通讯系统需求|学习笔记
快速学习海量用户即时通讯系统需求
102 0
海量用户即时通讯系统需求|学习笔记
|
网络协议 测试技术 Go
海量用户通讯系统-收发消息分析|学习笔记
快速学习海量用户通讯系统-收发消息分析
73 0
海量用户通讯系统-收发消息分析|学习笔记
|
NoSQL 网络协议 测试技术
海量用户通讯系统-Redis 用户验证分析|学习笔记
快速学习海量用户通讯系统-Redis 用户验证分析
134 0
海量用户通讯系统-Redis 用户验证分析|学习笔记
|
JSON NoSQL 网络协议
海量用户通讯系统-用户注册(2)|学习笔记
快速学习海量用户通讯系统-用户注册(2)
114 0