海量用户通讯系统-服务器接收消息1

简介: 海量用户通讯系统-服务器接收消息1

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

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


海量用户通讯系统-服务器接收消息1

 

内容介绍:

一、思路分析

二、代码实现

 

一、 思路分析

对上节课的代码进行一下修改,服务器部分,

将“buf := make([ ]byte, 8096)”提至“defer conn.Close()”与“//循环的客户端发送的信息” 之间,有一个缓冲就可以了;“n,err := conn. Read (buf [:4])”中的n的判断意义不大,可以去掉,指定读4个字节。

Read的含义:

net中找到func Fileconn(f *os.File)(c Conn.err error)

// Read从连接中读取数据

// Read方法可能会在超过某个固定时间限制后超时返回错误,该错误的Timeout()方法返回真

Read(b [ ]byte) (n int, err error)

其中n值代表实际上读了多少个字节

2. 完成客户端可以完成发送消息本身,服务器端可以正常接收消息,并根据客户端发送的消息(loginmes),判断用户的合法性,并返回相应的loginresmes。

思路分析:

(1)让客户端发送消息本身

(2)服务器端接收到消息,然后反序列化成对应的消息结构体

(3)服务器端根据反序列化成对应的消息,判断是否登录用户是合法的用户,返回LoginResMes

(4)客户端解析返回的LoginResMes显示对应界面

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

客户端发送的消息就是登录消息,服务端接收到的消息是字节、字符串,将其反序列化成对应的消息,结构体;

服务器端根据反序列化的消息结构体,判断登录用户是否为合法用户,返回LoginResMes,客户端解析返回的LoginResMes显示对应界面(发送——返回——处理——再处理)。

 

二、代码实现:

package main

import (

"fmt"

"net"

"go_code/chatroom/common/message”

"encoding/binary"

"encoding/josn"

“errors”

)

func readPkg(conn net.conn)(mes message.Message, err error) {

buf:=make([ ]byte,8096)

fmt.Print1n("读取客户端发送的数据...")

_,err := conn,Read(buf[:4])

If err !=nil {

fmt.Print1n( "conn.Read err=", err)

err = errors.New("read pkg header error")

return

}

//根据buf[ :4]转成一个uint32类型

var pkgLen uint32

pkgLen = binary.BigEndian.uint32(buf[0:4])

//根据pkgLen读取消息内容

n,err:=conn. Read(buf[ :pkglen])

if n!=int(pkglen) || err!=nil{

fmt.Print1n( "conn. Read fail err=", err)

return

}

//把pkgLen反序列化成-> message. Message

//技术就是一层窗户纸&mes!!

err=json. Unmarshal(buf[ : pkgLen], &mes)

if err != nil {

fmt.Print1n( "json.Unmarsha err=", err)

return

}

return

}

//处理和客户端的通讯

func process( conn net.conn) {

//这里需要延时关闭conn

defer conn.close()

buf := make([ ]byte, 8096)

//循环的客户端发送的信息

for {

//这里我们将读取数据包,直接封装成一个函数readPkg(),返回Message,Err

mes, err :=readPkg(conn)

if err != nil {

fmt.Print1n( "readPkg err=", err)

}

fmt.Print1n("mes=", mes)

}

}

Func  main() {

//提示信息

fmt.Print1n(“服务器在8889端口监听...."")

listen, err:= net.Listen( "tcp", "0.0.0.0:8889")

defer listen.c1ose()

if err != nil {

Buf:=make([ ]byte,8096)

fmt.Print1n("读取客户端发送的数据...")

_,err := conn,Read(buf[:4])

If err !=nil {

fmt.Print1n( "conn.Read err=", err)

return

}

fmt.Print1n("读到的buf=",buf[:4])

代码分析:

发送长度之后,服务端接收到客户端发送的长度,然后客户端发送消息本身,发送的内容就是data,n的作用不大,判断是否产生error,发送消息本身过后,这里还需要处理服务器端返回的消息,要一步一步来进行,读完链接,将其序列化,返回其长度,同时返回一个message,有错误的返回error,这里我们将读取数据包,直接封装成一个函数readPkg(),返回Message,Error。

根据buf[ :4]转成一个uint32类型,

binary.BigEndian.uint32(buf[0:4]),

encoding/binary中有一个uint32([ ]byte) uint32函数,根据pkgLen读取消息内容,理解为从conn中读pkglen个字节放到buf中,希望读pkglen个字节,但实际的读取量是不确定的,如果n不等于pkglen或者管道关闭,就会发生错误信息。

把pkgLen反序列化成-> message. Message类型,err=json. Unmarshal(buf[ : pkgLen], &mes)。

很重要的细节:如果不加&mes,则message是空的。反序列化失败要做一个判断,而后返回message。

记得在最前面引进

"go_code/chatroom/common/message”

"encoding/binary"

"encoding/josn"

自定义出错的部分err = errors.New

在最前边引进“errors”包

可以正常接收消息:加入fmt.Print1n( "readPkg err=", err)

编译结果

image.png

读取客户端发送的数据时发生错误:

image.png

相关文章
|
16天前
|
安全 云计算
服务器系统资源不足怎么办
服务器系统资源不足怎么办
26 4
|
22天前
|
弹性计算 监控 数据库
制造企业ERP系统迁移至阿里云ECS的实例,详细介绍了从需求分析、数据迁移、应用部署、网络配置到性能优化的全过程
本文通过一个制造企业ERP系统迁移至阿里云ECS的实例,详细介绍了从需求分析、数据迁移、应用部署、网络配置到性能优化的全过程,展示了企业级应用上云的实践方法与显著优势,包括弹性计算资源、高可靠性、数据安全及降低维护成本等,为企业数字化转型提供参考。
43 5
|
28天前
|
缓存 监控 数据库
提高服务器响应速度是提升用户体验和系统性能的关键
提高服务器响应速度是提升用户体验和系统性能的关键
34 3
|
2月前
|
监控 Java Linux
Linux系统之安装Ward服务器监控工具
【10月更文挑战第17天】Linux系统之安装Ward服务器监控工具
64 5
Linux系统之安装Ward服务器监控工具
|
12天前
|
存储 Oracle 安全
服务器数据恢复—LINUX系统删除/格式化的数据恢复流程
Linux操作系统是世界上流行的操作系统之一,被广泛用于服务器、个人电脑、移动设备和嵌入式系统。Linux系统下数据被误删除或者误格式化的问题非常普遍。下面北亚企安数据恢复工程师简单聊一下基于linux的文件系统(EXT2/EXT3/EXT4/Reiserfs/Xfs) 下删除或者格式化的数据恢复流程和可行性。
|
1月前
|
存储 安全 关系型数据库
Linux系统在服务器领域的应用与优势###
本文深入探讨了Linux操作系统在服务器领域的广泛应用及其显著优势。通过分析其开源性、安全性、稳定性和高效性,揭示了为何Linux成为众多企业和开发者的首选服务器操作系统。文章还列举了Linux在服务器管理、性能优化和社区支持等方面的具体优势,为读者提供了全面而深入的理解。 ###
|
2月前
|
NoSQL Linux PHP
|
1天前
|
弹性计算 运维 安全
阿里云轻量应用服务器与ECS的区别及选择指南
轻量应用服务器和云服务器ECS(Elastic Compute Service)是两款颇受欢迎的产品。本文将对这两者进行详细的对比,帮助用户更好地理解它们之间的区别,并根据自身需求做出明智的选择。
|
2天前
|
SQL 弹性计算 安全
阿里云上云优选与飞天加速计划活动区别及购买云服务器后续必做功课参考
对于很多用户来说,购买云服务器通常都是通过阿里云当下的各种活动来购买,这就有必要了解这些活动的区别,同时由于活动内的云服务器购买之后还需要单独购买并挂载数据盘,还需要设置远程密码以及安全组等操作之后才能正常使用云服务器。本文就为大家介绍一下目前比较热门的上云优选与飞天加速计划两个活动的区别,以及通过活动来购买云服务器之后的一些必做功课,确保云服务器可以正常使用,以供参考。
|
4天前
|
弹性计算 安全 开发工具
灵码评测-阿里云提供的ECS python3 sdk做安全组管理
批量变更阿里云ECS安全组策略(批量变更)