海量用户通讯系统-服务器接收消息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

相关文章
|
19天前
|
Linux 网络安全 数据安全/隐私保护
SSH工具连接远程服务器或者本地Linux系统
SSH工具连接远程服务器或者本地Linux系统
19 0
|
5天前
|
Linux 网络安全 数据库
linux centos系统搭建samba文件服务器 NetBIOS解析 (超详细)
linux centos系统搭建samba文件服务器 NetBIOS解析 (超详细)
|
6天前
|
存储 安全 Unix
服务器的常用系统
【5月更文挑战第5天】服务器的常用系统
30 9
|
14天前
|
监控 负载均衡 网络协议
|
18天前
|
监控 安全 Linux
Linux系统之安装ServerBee服务器监控工具
【4月更文挑战第22天】Linux系统之安装ServerBee服务器监控工具
59 2
|
23天前
|
JavaScript 前端开发 UED
Vue工具和生态系统: Vue.js和服务器端渲染(SSR)有关系吗?请解释。
Vue.js是一个渐进式JavaScript框架,常用于开发单页面应用,但其首屏加载较慢影响用户体验和SEO。为解决此问题,Vue.js支持服务器端渲染(SSR),在服务器预生成HTML,加快首屏速度。Vue.js的SSR可手动实现或借助如Nuxt.js的第三方库简化流程。Nuxt.js是基于Vue.js的服务器端渲染框架,整合核心库并提供额外功能,帮助构建高效的应用,改善用户体验。
20 0
|
29天前
|
Java 关系型数据库 MySQL
阿里云服务器Linux系统部署JavaWeb项目
阿里云服务器Linux系统部署JavaWeb项目
|
1天前
|
负载均衡 固态存储 Linux
阿里云轻量应用服务器、云服务器、gpu云服务器最新收费标准参考
轻量应用服务器、云服务器、gpu云服务器是阿里云服务器产品中,比较热门的云服务器产品类型,不同类型的云服务器产品收费模式与收费标准是不一样的,本文为大家展示这几个云服务器产品的最新收费标准情况,以供参考。
阿里云轻量应用服务器、云服务器、gpu云服务器最新收费标准参考
|
1天前
|
弹性计算 负载均衡 容灾
应用阿里云弹性计算:打造高可用性云服务器ECS架构
阿里云弹性计算助力构建高可用云服务器ECS架构,通过实例分布、负载均衡、弹性IP、数据备份及多可用区部署,确保业务连续稳定。自动容错和迁移功能进一步增强容灾能力,提供全方位高可用保障。
5 0
|
1天前
|
存储 弹性计算 监控
探索阿里云弹性计算:如何优化云服务器ECS的性能与成本
在云时代,【阿里云ECS】的性能优化与成本控制至关重要。利用实例规格选择、自动伸缩、网络和存储配置,可增强性能、减少成本。结合监控工具和优化建议,用户能解决性能问题,提升应用稳定性,实现高效且经济的云计算运营。
7 1