海量用户系统-客户端结构改进2|学习笔记

简介: 快速学习海量用户系统-客户端结构改进2

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

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


海量用户系统-客户端结构改进2

 

内容简介:

一、聊天室的服务器端的程序框架

二、分包

 

一、聊天室的服务器端的程序框架

服务器端和客户端都有主要的负责文件。例如Common/message有服务器和客户端公用的文件,比如说message.go

1.服务器

(1)main.go:监听;等待客户端的连接;做初始化的工作

(2)Processor.go(总的处理器):

根据客户端的请求,调用相应的处理器,完成相应的任务

(3)smsProcess.go:

处理和短消息相关的请求;群聊;点对点聊天

(4)userProcess.go:

处理和用户相关的请求;登录、注册、注销;用户列表管理

(5)utils.go:

一些常用的工具的函数、结构体;提供常用的方法和函数

2.客户端

(1)main.go:

显示第一级菜单;根据用户的输入,去调用对应的处理器

(2)smsProcess.go:

处理和短消息相关逻辑;私聊;群发

(3)userProcess.go:

处理和用户相关的业务;登录 、注册等等...

(4)server.go

显示登录成功界面;保持和服务器通讯(即启动协程);当读取服务器发送的消息后,就会显示在界面

(5)utils.go:

一些常用的工具的函数,结构体;提供常用的方法和函数

 

二、分包

1.先把各个文件放到对应的文件夹【包】

image.png

客户端,不能三个文件都放在一起。

步骤:

(1)建四个包main、process、utils、model(后面会用到)server可以放在main或者process里。

(2)剥离:不要先把别人的文件或者原先文件马上删掉,要一个一个的剥离。不可能一个功能对应一个文件,这是不现实的。原先文件里面会有一个主文件,复制到main包里面去。

(3)新建两个空的文件,第一个userprocess,是处理跟业务相关的,它跟服务器对接。和服务端的文件同名,本身两个都在不同的大的文件夹下面,这是可以区分的。第二个,专门处理短信的smsProcess.go。

(4)之前的课程有utils文件,可以直接复制到utils包。将server/utils.go 拷贝到 client/utils/utils.go

(5)创建了server/utils.go/userProcess.go

//封装userProcess.go。打包P ackage process.

package process

import(

“fmt”

“net”

“go_code/chatroom/common/message”

“go_code/chatroom/client/utils”

“encoding/binary”

“enconding/json”

//这有一个关联,用户怎样登录的一个方法。先把这个结构体写出来

Type Userprocess struct{

//暂时不需要字段..因为它的连接都是自己拿到的,所以这个地方其实是暂时不需要任何东西。

}

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

说明:该文件就是在原来的login.go中做了一个改进,即封装到userProcess结构体(有一些修改的部分如下:)

//创建一个transfer实例

tf := &utis.Transfer{

Conn: conn

}

mes, err = tf.Readpkg()

文件什么都可以不写但必须归属为一个包,

所有文件里面写代码:package process这是一个最基本的原理

(6)创建了server/process/server.go

第一个任务要显示登录成功的界面,写个菜单

第二个保持和通讯

package process

import(

“fmt”

“os”

“go_code/chatroom/client/utils”

“net”

//显示登录成功后的界面..

func ShowMenu(){

fmt.Println(“-------恭喜xxx登录成功-------”)

fmt.Println(“-------1.显示在线用户列表-------”)

fmt.Println(“-------2.发送消息-------”)

fmt.Println(“-------3.信息列表-------”)

fmt.Println(“-------4.退出系统-------”)

fmt.Println(“请选择(1-4):”)

var key int

fmt.Scanf(“%d\n”,&key)

switch key {

case 1:

fmt.println(“显示在线用户列表-”)

case 2:

fmt.println(“发送消息-”)//如果是发送消息,给谁发

可能会有些形式,给张三发还是群聊等等

case 3:

fmt.println(“信息列表-”)

case 4:

fmt.println(“你选择退出了系统...”)

os.Exit(0)

//还有一种特别好的一种思想是在退之前先给服务器发个消息说我要走了.比如说拜拜,服务器那边收到一个拜拜,也去把这个链接关掉,

因为有时候服务器在这个客户走之前,需要做一些工作,有可能客户端有很多消息是写在缓存里面的,不会每次都入库,发现他要走了过后,马上先把跟他用户相关的缓存的内容入库或者是落盘,

default :

fmt.println(“你输入的选项不正确...”)

//如果输入内容不对 反复提醒

}

}

//和服务器保持通讯

func serverProcessMes(conn net.Conn){

//做分层封装,不需要再去搞一个函数

Transfer上来以后先实例化,先把它做成一个全局,哪个地方需要直接用。跟客户服务器端连接是一个连接,只要读的话,直接把它做成一个全局的,或者说把它做成放在一个文件里,直接用更方便。

//创建一个transfer实例,不停的读取服务器发送的消息

tf := &utis.Transfer{

Conn: conn

}

for {//菜单循环

fmt.Println(“客户端%s正在等待读取服务器发送的消息”)

mes , err := tf.ReadPkg()

If err != nil {

fmt.Println(“if.ReadPkg err=”,err)

return

}

// 如果读取到消息,又是下一步处理逻辑

fmt.Printf(“mes=%v\n”,mes)

}

}

(4)server/main/main.go代码修改如下:

package process

import(

“fmt”

“os”

“go_code/chatroom/client/utils”

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

var userId int

var userPwd string

func main(){

//接收用户的选择

var key int

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

for true {

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(“登陆聊天室”)

fmt.Println(“请输入用户名的id”)

fmt.Scanf(“%d\n”,&userID)

fmt.Println(“请输入用户名的密码”)

fmt.Scanf(“%d\n”,&userPwd)

case 2:

fmt.Println(“注册用户”)

case 3:

fmt.Println(“退出系统”)

os.Exit(0)

default :

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

}

}

(5)在userProcess.go中调用ShowMenu

添加代码如下:

//显示我们的登录成功的菜单[循环]..

for {

ShowMenu()

}

(6)运行 输入用户名和密码正确以后显示

读取客户端发送的数据...

-------恭喜xxx登录成功-------

-------1.显示在线用户列表-------

-------2.发送消息-------

-------3.信息列表-------

-------4.退出系统------

请选择(1-4):

(7)在userProcess.go中

//这里我们还需要在客户端启动一个协程

//该协程保持和服务器端的通讯,如果服务器有数据推送给客户端

//则接收并显示在客户端的终端

(8)在server.go代码的基础上添加:

//和服务器保持通讯

func serverProcessMes(conn net.Conn){

//创建一个transfer实例,不停的读取服务器发送的消息

tf := &utis.Transfer{

Conn: conn

}

for {//连接只要是畅通的,能一直读取消息

fmt.Println(“客户端%s正在等待读取服务器发送的消息”)

mes , err := tf.ReadPkg()

If err != nil {//如果出错就退出

fmt.Println(“if.ReadPkg err=”,err)

return

}

// 如果读取到消息,又是下一步处理逻辑

fmt.Printf(“mes=%v\n”,mes)

}

}

(9)调用

在步骤7的基础上添加:

go serverProcessMes(conn)

(10)再次运行

输入用户名和密码正确以后显示:

读取客户端发送的数据...

-------恭喜xxx登录成功-------

-------1.显示在线用户列表-------

-------2.发送消息-------

-------3.信息列表-------

-------4.退出系统------

请选择(1-4):

客户端正在等待读取服务器发送的消息

读取客户端发送的数据...

相关文章
|
Web App开发 编解码 Ubuntu
YouTube下载视频教程:常用的网站软件插件APP都有涉及
有时候可能需要YouTube上的视频来进行一些操作,比如教程演示,语言学习,视频编辑等.....那么YouTube视频怎么下载下来呢?方法比较多。在这篇文章里我会给大家介绍一些下载YouTube视频的常用网站、浏览器插件、电脑软件和手机APP,方便大家找到最合适的方法去保存油管视频。
2767 1
YouTube下载视频教程:常用的网站软件插件APP都有涉及
|
8月前
|
机器学习/深度学习 算法 PyTorch
PyTorch 实现MobileNetV1用于图像分类
本实验基于PyTorch和昇腾平台,详细讲解了如何使用MobileNetV1模型对CIFAR10数据集进行图像分类。内容涵盖MobileNetV1的特点、网络架构剖析(尤其是深度可分离卷积)、代码实现及训练过程。通过该实验,读者可以掌握轻量级CNN模型在移动端或嵌入式设备中的应用,并了解其在资源受限环境下的高效表现。实验包括数据预处理、模型训练与测试等环节,帮助用户快速上手并优化模型性能。
234 53
|
消息中间件 存储 Java
Android面试高频知识点(2) 详解Android消息处理机制(Handler)
Android 消息处理机制估计都被写烂了,但是依然还是要写一下,因为Android应用程序是通过消息来驱动的,Android某种意义上也可以说成是一个以消息驱动的系统,UI、事件、生命周期都和消息处理机制息息相关,并且消息处理机制在整个Android知识体系中也是尤其重要,在太多的源码分析的文章讲得比较繁琐,很多人对整个消息处理机制依然是懵懵懂懂,这篇文章通过一些问答的模式结合Android主线程(UI线程)的工作原理来讲解,源码注释很全,还有结合流程图,如果你对Android 消息处理机制还不是很理解,我相信只要你静下心来耐心的看,肯定会有不少的收获的。
559 3
Android面试高频知识点(2) 详解Android消息处理机制(Handler)
|
传感器 安全 大数据
|
机器学习/深度学习 监控 安全
现货量化合约跟单/交易所系统开发成熟技术/案例搭建/玩法详情/步骤指南
现货量化合约跟单系统开发是指构建一个系统,通过使用量化交易策略,实现将现货市场的交易信号自动化地应用到交易合约中,以进行自动化的跟单交易。 以下是现货量化合约跟单系统开发的关键概述:
|
XML JSON 数据安全/隐私保护
如何使用Fiddler抓取APP接口和微信授权网页源代码
Fiddler是一款强大的抓包工具,用于捕获HTTP/HTTPS流量,包括手机APP和微信授权页面的数据。下载安装Fiddler后,需设置电脑代理,如端口8888,并在手机上配置相同代理,确保两者在同一局域网。通过安装Fiddler证书,可解密HTTPS请求。在手机上打开目标应用或网页,Fiddler将显示请求详情,便于接口调试和数据查看。
528 0
如何使用Fiddler抓取APP接口和微信授权网页源代码
|
消息中间件 关系型数据库 Kafka
实时计算 Flink版操作报错之在执行任务时遇到了一个IO错误,具体表现为无法从本地主机(localhost)下载文件,该怎么解决
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
机器学习/深度学习 自然语言处理 知识图谱
探索深度学习中的迁移学习:知识融合与创新应用
迁移学习在深度学习领域中扮演着重要角色,但其应用依然充满挑战与机遇。本文从知识融合和创新应用两个方面探讨迁移学习的发展趋势与前景,通过深入分析相关理论与实践案例,揭示迁移学习在解决现实问题中的潜力与局限,并展望其在未来的发展方向。
484 1
|
C# 图形学
Winform控件优化之Paint事件实现圆角组件(提取绘制圆角的扩展方法)
Paint事件方法中实现圆角控件不要通过事件参数`e.ClipRectangle`获取控件区域范围,原因见最后介绍;注意设置控件背景透明(参见[Winform控件优化之背景透明那些事2...
992 0
Winform控件优化之Paint事件实现圆角组件(提取绘制圆角的扩展方法)
|
小程序 JavaScript 前端开发
微信小程序授权登陆 getUserProfile
微信小程序授权登陆 getUserProfile
391 0