Go语言学习篇08

Go语言学习篇8

海量用户即时通信系统

需求分析

1)用户注册

2)用户登录

3)显示在线用户列表

4)群聊

5)点对点聊天

6)离线留言

界面设置

  1. 显示客户端登陆菜单(正确显示)

通讯流程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lbwSW44T-1609160469245)(Go语言学习篇08.assets/在这里插入图片描述
)]

实现功能-完成初始化界面

1)让客户端发送消息长度

2)让客户端发送消息本身

3)服务器接收消息,然后反序列化消息结构体

4)客户解析返回LoginResMes,显示对应界面

5)这里我们需要做函数封装

实现功能-完成程序结构化

1)服务器修改,同时客户端也得修改,难受

2)程序改进,结构化(提高可读性)

3)画出程序框架改进图

  • 步骤
    • 现将分析出来的文件创建好
    • 放入相应的文件夹中
    • 剥离,根据各个文件完成的任务不同进行分离
    • 修改服务端
    • 修改客户端

在这里插入图片描述

在这里插入图片描述

实现功能-完成用户登录

1)model包完善

2)创建User结构体(用于Redis数据交互)

3)创建Error常量(自定义业务逻辑错误类型)

4)全局并初始化Redis连接池

5)全局+工厂模式+初始化UserDao

6)登录校验完善

7)Redis取值User密码校验

在这里插入图片描述

实现功能-完成注册用户

1)完成注册功能,将用户录入Redis数据库中

2)客户端注册功能

3)客户端:用户输入—>调用Register—>连接服务器—>发送mes---->接收resMes

4)服务端注册功能

5)服务端:dao增加用户—>增加用户的方法—>协程中增加注册方法—>根据类别选定调用的方法

实现功能-完成显示在线用户

1)LoginResMes添加在线用户切片

2)UserProcess,添加UserId表示Conn

3)写map的增删改查

4)编写userMgr

5)用户登录成功添加userProcess

代码

在这里插入图片描述

在这里插入图片描述

思路

在这里插入图片描述

实现功能-通知用户上线功能

1)一个用户登录,服务器推送用户状态

2)客户端自己维护

在这里插入图片描述

实现功能-完成群聊

1)客户端端的Conn只在Login中存在,客户端并没有维护Conn【CurUser】

在这里插入图片描述

2)新增一个smsMes结构体,增加SendGroupMes[群聊]方法

实现功能-拓展功能

1、实现私聊

2、如果一个登陆用户离线,就把这个人从在线列表去掉

  • 客户端强制退出 OK
  • 客户端输入退出

3、实现离线留言

4、发一个文件

注意事项-坑1

代码

main包login.go

package main

import "fmt"

func (user *User)Login() (bool, string) {
    
    
	// 是否登录通过
	var flag = false
	// 返回信息
	var error string = "登录失败"

	fmt.Println("账号:", user.username)
	fmt.Println("密码:", user.password)
	return flag, error
}

main包client.go

package main

import (
	"fmt"
	"os"
)

type User struct{
    
    
	username string
	password string
}

func main() {
    
    
	// 接收用户的选择
	var key int
	// 是否继续显示菜单
	var loop bool = true
	for true {
    
    
		fmt.Println("-----欢迎登录多人聊天系统-----")
		fmt.Println("\t\t\t 1 登陆聊天室")
		fmt.Println("\t\t\t 2 注册用户")
		fmt.Println("\t\t\t 3 退出系统")
		fmt.Print("\t\t\t请选择(1-3):")

		fmt.Scanf("%d\n", &key)
		switch key {
    
    
		case 1:
			fmt.Println("登录聊天室")
			loop =false
		case 2:
			fmt.Println("注册用户")
			loop = false
		case 3:
			fmt.Println("退出系统")
			os.Exit(0)
		default:
			fmt.Println("您的输入有误,请重新输入!")
		}
		if !loop {
    
    
			break
		}
	}

	var user *User = new(User)
	// 根据用户输入显示新的提示信息
	if key == 1 {
    
    
		// 说明用户要登录
		fmt.Print("用户账户:")
		fmt.Scanf("%v", &user.username)
		fmt.Print("用户密码:")
		fmt.Scanf("%v", &user.password)
		// 登录函数
		loginFlag, loginMsg := user.Login()
		if loginFlag {
    
    
			fmt.Println("登录成功,", loginMsg)
		} else {
    
    
			fmt.Println("登录失败,", loginMsg)
		}

		// 成功后跳转页面
	} else if key == 2{
    
    
		fmt.Println("进行用户注册的逻辑")
	}
}

dos密令运行

D:\Work\Goland\Go\src\go_project\chatRoom\Client>dir
 驱动器 D 中的卷是 Data
 卷的序列号是 2C37-C14D

 D:\Work\Goland\Go\src\go_project\chatRoom\Client 的目录

2020/12/21  15:41    <DIR>          .
2020/12/21  15:41    <DIR>          ..
2020/12/21  15:41             1,256 client.go
2020/12/21  15:37               264 login.go
               2 个文件          1,520 字节
               2 个目录 820,620,009,472 可用字节

D:\Work\Goland\Go\src\go_project\chatRoom\Client>go run client.go
# command-line-arguments
.\client.go:53:30: user.Login undefined (type *User has no field or method Login)

解决方法

D:\Work\Goland\Go\src>go build -o client.exe go_project\chatRoom\Client
D:\Work\Goland\Go\src>client.exe

注意事项-坑2

D:\Work\Goland\Go\src>client.exe
-----欢迎登录多人聊天系统-----
                         1 登陆聊天室
                         2 注册用户
                         3 退出系统
                        请选择(1-3):1
登录聊天室
用户账户:lsx
用户密码:账号: lsx
密码:
登录失败, 登录失败

在这里插入图片描述

或者使用 fmt.Scanln(&username)

注意事项-坑3

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/IT_Carter/article/details/111874898