当前位置: 首页 > news >正文

阿里云怎么做淘客网站软文交易平台

阿里云怎么做淘客网站,软文交易平台,多少钱英语怎么说,长春做网站搜吉网传媒文章目录 WebSocket 简介时序图核心逻辑Client 结构与功能创建新客户端消息读取逻辑 (ReadPump)发送消息逻辑 (Send)客户端管理器 (ClientManager)WebSocket 处理器处理心跳与长连接 总结 本文将基于 Go 语言,通过使用 gorilla/websocket 库来实现一个简单的聊天应用…

文章目录

    • WebSocket 简介
    • 时序图
    • 核心逻辑
      • Client 结构与功能
      • 创建新客户端
      • 消息读取逻辑 (ReadPump)
      • 发送消息逻辑 (Send)
      • 客户端管理器 (ClientManager)
      • WebSocket 处理器
      • 处理心跳与长连接
    • 总结

本文将基于 Go 语言,通过使用 gorilla/websocket 库来实现一个简单的聊天应用。该应用具备处理 WebSocket 连接、消息传输、以及用户连接管理等功能。我们将详细展示如何实现这些功能,并剖析背后的核心逻辑与原理。

WebSocket 简介

WebSocket 是一种全双工的通信协议,允许客户端和服务器之间在一个持久连接上进行双向数据传输。与 HTTP 的短连接不同,WebSocket 可以在建立连接后保持连接状态,从而实现实时通信。因此,WebSocket 非常适合用于聊天应用等需要实时数据传输的场景。

时序图

客户端 客户端管理器 WebSocket处理器 请求连接 新客户端加入 确认连接 连接成功 发送消息 消息路由 路由结果 消息送达 loop [消息读取] 发送心跳 响应Pong 客户端 客户端管理器 WebSocket处理器

核心逻辑

在本示例中,我们主要实现了以下几个核心模块:

  1. Client:表示单个 WebSocket 连接的客户端,负责处理消息的收发。
  2. ClientManager:用于管理多个客户端的连接,处理客户端的增加、删除以及消息的路由。
  3. WebSocket 处理逻辑:处理新连接的建立、消息的读取与发送。

Client 结构与功能

type Client struct {conn         *websocket.ConnmessageQueue chan []bytemu           sync.Mutexuser         string
}

Client 结构体用于表示一个 WebSocket 客户端连接。每个客户端包含:

  • conn:当前的 WebSocket 连接。
  • messageQueue:用于存储待发送的消息队列。
  • mu:用于保证并发安全的互斥锁。
  • user:表示客户端的用户标识。

创建新客户端

func NewClient(user string, conn *websocket.Conn) *Client {return &Client{conn:         conn,user:         user,messageQueue: make(chan []byte, 100),}
}

NewClient 函数用于创建新的客户端实例。每个客户端都有一个独立的消息队列,用于存储要发送给客户端的消息。

消息读取逻辑 (ReadPump)

func (c *Client) ReadPump() {defer func() {c.conn.Close()}()for {mt, message, err := c.conn.ReadMessage()if err != nil {log.Println("read:", err)manager.mu.Lock()delete(manager.clients, c.user)_ = c.conn.Close()manager.mu.Unlock()break}if mt == websocket.TextMessage || mt == websocket.PingMessage {c.mu.Lock()c.messageQueue <- messagec.mu.Unlock()}}
}

ReadPump 方法用于持续从 WebSocket 连接中读取消息,并将接收到的消息存储到 messageQueue 队列中。该方法通过一个无限循环,不断读取 WebSocket 的消息。当出现错误时,例如客户端断开连接,便会关闭当前连接并将该客户端从客户端管理器中移除。

其中,ReadMessage() 方法用于从 WebSocket 连接中读取消息,返回的 mt 表示消息类型。常见的类型包括文本消息(TextMessage)和 ping 消息(PingMessage)。对于这些消息类型,消息会被推送到 messageQueue 以便后续处理。

发送消息逻辑 (Send)

func Send(user string, returnMessage []byte, logger logx.Logger) {manager.mu.RLock()client, exists := manager.clients[user]manager.mu.RUnlock()if !exists {logger.Infof("client not found for user:%s message:%s", user, string(returnMessage))return}client.mu.Lock()err := client.conn.WriteMessage(websocket.TextMessage, returnMessage)client.mu.Unlock()if err != nil {logger.Errorf("client.conn.WriteMessage error %s", err.Error())manager.mu.Lock()delete(manager.clients, user)manager.mu.Unlock()_ = client.conn.Close()}
}

Send 函数负责向指定的用户发送消息。首先,它会检查用户是否存在于 ClientManager 中,如果不存在则记录日志并返回。如果用户存在,则通过 WriteMessage() 方法将消息发送给客户端。若发送消息时发生错误,会将该用户从连接管理器中移除,并关闭该 WebSocket 连接。

客户端管理器 (ClientManager)

type ClientManager struct {clients map[string]*Clientmu      sync.RWMutex
}var manager = ClientManager{clients: make(map[string]*Client),
}

ClientManager 用于管理多个客户端的连接,clients 字段是一个存储所有客户端连接的映射,键是用户标识,值是客户端对象。通过读写锁 (sync.RWMutex),确保在并发访问时的线程安全。

WebSocket 处理器

ChatWebsocketHandler 是处理 WebSocket 连接的 HTTP 处理函数。

func ChatWebsocketHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {return func(w http.ResponseWriter, r *http.Request) {conn, err := upgrader.Upgrade(w, r, nil)logger := logx.WithContext(r.Context())if err != nil {logger.Errorf("upgrade:%+v", err)return}user := r.URL.Query().Get("user")if user == "" {logger.Errorf("user is empty:")_ = conn.Close()return}client := NewClient(user, conn)manager.mu.Lock()oldClient, exists := manager.clients[user]if exists {_ = oldClient.conn.Close()}manager.clients[user] = clientmanager.mu.Unlock()go client.ReadPump()// 省略其他消息处理逻辑...}
}
  1. 连接升级:首先使用 upgrader.Upgrade() 将 HTTP 请求升级为 WebSocket 连接。
  2. 用户认证:通过 URL 查询参数获取用户 ID,并创建对应的 Client
  3. 旧连接处理:如果该用户已经有一个旧的 WebSocket 连接,则会关闭旧连接。
  4. 启动消息读取:通过启动 ReadPump() 协程,持续读取该用户的 WebSocket 消息。

处理心跳与长连接

在 WebSocket 通信中,维持长连接的一个常用做法是使用心跳机制。

if req.Heartbeat {// 处理心跳消息err = client.conn.WriteMessage(websocket.PongMessage, []byte(""))if err != nil {logger.Errorf("write pong message failed:", err)manager.mu.Lock()delete(manager.clients, user)manager.mu.Unlock()_ = client.conn.Close()return}
}

每当接收到心跳消息时,服务器会返回一个 PongMessage,以维持连接的活跃状态。如果发送 PongMessage 失败,服务器会关闭该客户端连接。

总结

本文详细展示了如何使用 Go 语言实现一个 WebSocket 聊天应用的核心逻辑。我们讨论了客户端的创建与管理、消息的收发、以及长连接的维持等关键功能。通过这些核心组件,我们可以轻松地扩展功能,构建复杂的 WebSocket 应用。

WebSocket 实现的关键在于良好的连接管理和消息处理机制,这样可以确保在高并发情况下仍然能维持高效且稳定的实时通信。

关注我

http://www.hkea.cn/news/254760/

相关文章:

  • 阿里云认证网站建设题库seo助理
  • 凤岗网站仿做靠谱seo外包定制
  • xampp安装wordpress说明徐州seo外包
  • 啥网站都能看的浏览器下载百度收录查询工具
  • 福田附近公司做网站建设哪家效益快奶糖 seo 博客
  • 临沂免费自助建站模板品牌整合营销
  • iis做本地视频网站找客户资源的网站
  • 做调查用哪个网站网络推广有多少种方法
  • 开发一个交易网站多少钱在线工具
  • 网站平台怎么建立的软文范例
  • 移动应用开发专业学什么东莞seo软件
  • 做宣传网站的公司手机百度极速版app下载安装
  • 私人可以做慈善网站吗外贸如何推广
  • 网站页面模板页面布局如何成为百度广告代理商
  • 瑞安外贸网站建设曲靖百度推广
  • 先做网站还是服务器销售营销方案100例
  • 用卫生纸做的礼物街网站免费网页空间到哪申请
  • 手游网站做cpc还是cpm广告号厦门网页搜索排名提升
  • 人个做外贸用什么网站好宁波百度seo点击软件
  • 诈骗网站怎么做的企业网站seo案例分析
  • 如何做网站接口湖南营销型网站建设
  • 进入兔展网站做PPt软文营销ppt
  • app网站新闻危机公关
  • 东莞关键词优化实力乐云seo南宁seo外包服务商
  • 做网站都是用源码么免费注册个人网站不花钱
  • 建设网站需要两种服务支持官网设计公司
  • 安庆做网站seo建站收费地震
  • 绵阳住房和城市建设局网站官网seo排名优化联系13火星软件
  • 网站开发建设费用关键词异地排名查询
  • 网站建设企业电话广州优化疫情防控举措