开发者学堂课程【Go 语言核心编程 - 面向对象、文件、单元测试、反射、TCP 编程:海量用户通讯系统-完成界面】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/626/detail/9797
海量用户通讯系统-完成界面
内容介绍
一、实现功能-显示客户端登录菜单
二、总结
一、实现功能-显示客户端登录菜单
在涉及到注册与留言时,项目要保存用户信息和消息数据,因此我们需要学习数据库(Redis或Mysql),这里选择 Redis,所以先讲解如何在 Golang 中使用 Redis。
其中有两级菜单,首先在登录成功之后会看到第二层菜单。
(1)功能:能够正确地显示客户端的菜单。
(2)界面:
此时可以选择登录聊天系统、注册用户以及退出系统。当用户登录聊天系统成功后,则会显示界面如下:
1. 显示在线用户列表
2. 发送信息
3. 消息列表
4. 退出系统
在此要完成消息协议,消息协议的定夺极为重要。
(3)思路分析:思路分析很简单,直接进行书写就可以。
(4)代码实现
1.新建文件夹为 chatroom,在其中再建子文件夹代表客户端client与服务器端server。客户端中新建 main.go 文件,在登陆后要进行调用函数,写入 login.go 文件。写入如下:
package main
import (
"fmt"
)
//定义两个变量,一个表示用户id,一个表示用户密码
var userId int
var userPwd string
func main() {
//接收用户的选择
var key int
//判断是否还继续显示菜单
var loop = true
for loop {
fmt.Println(“----------------欢迎登陆多人聊天系统----------“)
fmt.Println("\t\t\t 1登陆聊天室")
fmt.Println("\t\t\t 2注册用户")
fmt.Println("\t\t\t 3退出系统")
fmt.Println("\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("退出系统")
loop = false
default:
fmt.Println(‘’你的输入有误,请重新输入‘’)
}
}
//更加用户的输入,显示新的提示信息
If key = = 1 {
//说明用户要登陆
fmt.Println(“请输入用户的id”)
fmt.Scanf(“%d/n”,&userId)
fmt.Println(“请输入用户的密码“)
fmt.Scanf(“%s/n”,&userPwd)
//先把登陆的函数,写到另一个文件,比如login.go
err := login(userId,userPwd)
if err != nil {
fmt.Println(“登录失败“)
} else {
fmt.Println(“登录成功“)
}
} else if key == 2 {
fmt.Println(“进行用户注册的逻辑…“)
}
}
完成后进行运行,先进到client,结果报错如下:
此时login没有被定义,原因为在主包时要完成编译时要退到src中进行操作。解决办法为进行几次退后推到go build go_code/chatroom/client,编译后会得到main.exe,此时再编译时会默认生成main.exe,要指定名字,客户端生成的则是client.exe,服务器端生成的则是server.exe。而退出系统也可以写入os.Exit()来进行,但要将“os“先写入。如果不带\n,没有换行,则会被认为回车则是要输出的东西。
2.login.go文件展示如下:
package main
import(
"fmt"
)
//写一个函数,完成登录
func login(userId int, userPwd string) (err error) {
//下一个就要开始定协议..
fmt.Println(" userId = %d userPwd=%s\n",userId, userPwd)
return nil //表示暂时没有错误
}
3.注意事项
用整数不用字符串是因为如果使用字符串回车后则会全部被去除。
根据 loop 来判断是否显示菜单。
所有的流程全都要自定义。
登录会很复杂,要输入用户名和密码再进行校验,校验完成后进行回复,此时要设计一个 message 协议。
以 error 的形式返回比以真假的形式返回更有说服力,error 可以返回各种错误。
两个都在主包里,在同一个包下面可以直接使用函数。
三、总结
1. client/main.go:
package main
import (
"fmt"
)
//定义两个变量,一个表示用户id,一个表示用户密码
var userId int
var userPwd string
func main() {
//接收用户的选择
var key int
//判断是否还继续显示菜单
var loop = true
for loop {
fmt.Println(“----------------欢迎登陆多人聊天系统----------“)
fmt.Println("\t\t\t 1登陆聊天室")
fmt.Println("\t\t\t 2注册用户")
fmt.Println("\t\t\t 3退出系统")
fmt.Println("\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("退出系统")
loop = false
default:
fmt.Println(‘’你的输入有误,请重新输入‘’)
}
}
//更加用户的输入,显示新的提示信息
If key = = 1 {
//说明用户要登陆
fmt.Println(“请输入用户的id”)
fmt.Scanf(“%d/n”,&userId)
fmt.Println(“请输入用户的密码“)
fmt.Scanf(“%s/n”,&userPwd)
//先把登陆的函数,写到另一个文件,比如login.go
err := login(userId,userPwd)
if err != nil {
fmt.Println(“登录失败“)
} else {
fmt.Println(“登录成功“)
}
} else if key == 2 {
fmt.Println(“进行用户注册的逻辑…“)
}
}
2.
client/login.go:
package main
import(
"fmt"
)
//写一个函数,完成登录
func login(userId int, userPwd string) (err error) {
//下一个就要开始定协议..
fmt.Println(" userId = %d userPwd=%s\n",userId, userPwd)
return nil //表示暂时没有错误
}