海量用户通讯系统-完成界面|学习笔记

简介: 快速学习海量用户通讯系统-完成界面

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

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


海量用户通讯系统-完成界面

 

内容介绍

一、实现功能-显示客户端登录菜单

二、总结

 

一、实现功能-显示客户端登录菜单

在涉及到注册与留言时,项目要保存用户信息和消息数据,因此我们需要学习数据库(Redis或Mysql),这里选择 Redis,所以先讲解如何在 Golang 中使用 Redis。

其中有两级菜单,首先在登录成功之后会看到第二层菜单。

(1)功能:能够正确地显示客户端的菜单。

(2)界面:

image.png此时可以选择登录聊天系统、注册用户以及退出系统。当用户登录聊天系统成功后,则会显示界面如下:

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,结果报错如下:

image.png

此时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 //表示暂时没有错误

}

相关文章
|
算法
【MATLAB】语音信号识别与处理:T1小波滤波算法去噪及谱相减算法呈现频谱
【MATLAB】语音信号识别与处理:T1小波滤波算法去噪及谱相减算法呈现频谱
316 0
|
11月前
|
Java 测试技术 持续交付
软件测试的艺术:从新手到专家
【9月更文挑战第35天】在软件开发的舞台上,测试是确保质量的关键步骤。本文将引导你穿越软件测试的迷宫,从基础理论到实践技巧,再到高级策略,揭示如何提升你的测试技能。无论你是初涉测试领域的新手,还是寻求进阶的资深人士,这篇文章都将为你提供宝贵的指导和启示。让我们一同探索软件测试的艺术,学习如何成为这一领域的专家。
|
7月前
|
人工智能 测试技术 数据处理
通义灵码 2.0 体验报告:Deepseek 加持下的 Python 开发之旅
通义灵码 2.0 体验报告:Deepseek 加持下的 Python 开发之旅
352 11
|
10月前
|
缓存 前端开发 安全
数据同步原理
数据同步原理
264 10
数据同步原理
|
文字识别 并行计算 JavaScript
PaddleOCR + Django 实现一个OCR在线识别网站,一起来玩呀
除了PaddleOCR之外,之前还介绍过一些其它好玩的开源项目,例如老照片修复 Bringing-Old-Photos-Back-to-Life 、黑白照片上色DeOldify 。因此,最近准备启动一个项目,做一个在线网站,将之前一些好玩的功能都陆续集成在这个网站中
PaddleOCR + Django 实现一个OCR在线识别网站,一起来玩呀
|
弹性计算 运维 监控
日志服务SLS体验评测
【8月更文挑战第13天】日志服务SLS体验评测
243 8
IndexedDB-增增删改查示例
IndexedDB-增增删改查示例
242 5
|
Ubuntu JavaScript Linux
WSL Ubuntu
WSL Ubuntu
165 1
|
JavaScript Java 测试技术
基于springboot+vue.js的智能家居系统附带文章和源代码设计说明文档ppt
基于springboot+vue.js的智能家居系统附带文章和源代码设计说明文档ppt
245 2
|
存储 关系型数据库 MySQL
Percona XtraBackup是否支持PostgreSQL数据库备份?
【5月更文挑战第13天】Percona XtraBackup是否支持PostgreSQL数据库备份?
239 1