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

佛山新网站建设详细内容市场监督管理局投诉电话

佛山新网站建设详细内容,市场监督管理局投诉电话,珠宝网站建设,滴滴优惠券网站怎么做在互联网时代,聊天系统是常见的应用场景之一。无论是即时通讯、在线客服还是多人游戏中的消息系统,聊天功能的实现都是必不可少的。本文将使用 Go 语言,结合 WebSocket 来构建一个简单的多人聊天室系统。 一、项目结构 首先,我们…

在互联网时代,聊天系统是常见的应用场景之一。无论是即时通讯、在线客服还是多人游戏中的消息系统,聊天功能的实现都是必不可少的。本文将使用 Go 语言,结合 WebSocket 来构建一个简单的多人聊天室系统。

一、项目结构

首先,我们设计一个简单的项目结构,文件结构如下:

go-chat/
│
├── main.go          // 主程序
├── client.go        // 处理客户端连接
└── hub.go           // 消息管理

WebSocket 简介

WebSocket 是一种基于 TCP 的网络协议,允许客户端和服务端建立持久的全双工通信连接。相比于传统的 HTTP 请求-响应模型,WebSocket 更加适合实时通信场景,因此它是实现聊天系统的理想选择。

二、实现思路

  1. 客户端连接管理:每个客户端通过 WebSocket 连接到服务器,服务器会为每个连接的客户端分配一个唯一的 connection
  2. 消息广播:当某个客户端发送消息时,服务器将该消息广播给所有连接的客户端。
  3. 并发处理:Go 原生支持并发编程,通过 Goroutine 和 Channel 可以轻松处理并发消息传递。

三、详细实现

1. main.go - 启动 WebSocket 服务

package mainimport ("log""net/http"
)func main() {hub := newHub()go hub.run()http.HandleFunc("/ws", func(w http.ResponseWriter, r *http.Request) {serveWs(hub, w, r)})log.Println("服务器启动,监听端口 8080...")err := http.ListenAndServe(":8080", nil)if err != nil {log.Fatal("监听失败:", err)}
}

main.go 文件的作用是启动 HTTP 服务器,并在 /ws 路径上处理 WebSocket 连接请求。

2. hub.go - 消息管理中心

Hub 负责管理所有的客户端连接,以及消息的广播。

package main// Hub 负责管理所有客户端的注册、注销及消息广播
type Hub struct {clients    map[*Client]bool // 已连接的客户端broadcast  chan []byte      // 从客户端接收的广播消息register   chan *Client     // 注册请求unregister chan *Client     // 注销请求
}func newHub() *Hub {return &Hub{clients:    make(map[*Client]bool),broadcast:  make(chan []byte),register:   make(chan *Client),unregister: make(chan *Client),}
}func (h *Hub) run() {for {select {case client := <-h.register:h.clients[client] = truecase client := <-h.unregister:if _, ok := h.clients[client]; ok {delete(h.clients, client)close(client.send)}case message := <-h.broadcast:for client := range h.clients {select {case client.send <- message:default:close(client.send)delete(h.clients, client)}}}}
}
  • clients:保存当前连接的所有客户端。
  • broadcast:一个通道,用于广播消息给所有客户端。
  • register/unregister:用于客户端连接和断开的注册和注销。

3. client.go - 处理客户端连接

每个客户端的连接由 Client 结构体表示,并包含了 WebSocket 连接和发送消息的通道。

package mainimport ("github.com/gorilla/websocket""log""net/http""time"
)const (writeWait = 10 * time.SecondpongWait  = 60 * time.SecondpingPeriod = (pongWait * 9) / 10
)var upgrader = websocket.Upgrader{ReadBufferSize:  1024,WriteBufferSize: 1024,
}type Client struct {hub  *Hubconn *websocket.Connsend chan []byte
}func serveWs(hub *Hub, w http.ResponseWriter, r *http.Request) {conn, err := upgrader.Upgrade(w, r, nil)if err != nil {log.Println("升级到 WebSocket 失败:", err)return}client := &Client{hub: hub, conn: conn, send: make(chan []byte, 256)}client.hub.register <- clientgo client.writePump()go client.readPump()
}func (c *Client) readPump() {defer func() {c.hub.unregister <- cc.conn.Close()}()c.conn.SetReadLimit(512)c.conn.SetReadDeadline(time.Now().Add(pongWait))c.conn.SetPongHandler(func(string) error { c.conn.SetReadDeadline(time.Now().Add(pongWait)); return nil })for {_, message, err := c.conn.ReadMessage()if err != nil {if websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway, websocket.CloseAbnormalClosure) {log.Printf("读取错误: %v", err)}break}c.hub.broadcast <- message}
}func (c *Client) writePump() {ticker := time.NewTicker(pingPeriod)defer func() {ticker.Stop()c.conn.Close()}()for {select {case message, ok := <-c.send:c.conn.SetWriteDeadline(time.Now().Add(writeWait))if !ok {c.conn.WriteMessage(websocket.CloseMessage, []byte{})return}w, err := c.conn.NextWriter(websocket.TextMessage)if err != nil {return}w.Write(message)n := len(c.send)for i := 0; i < n; i++ {w.Write(<-c.send)}if err := w.Close(); err != nil {return}case <-ticker.C:c.conn.SetWriteDeadline(time.Now().Add(writeWait))if err := c.conn.WriteMessage(websocket.PingMessage, nil); err != nil {return}}}
}
  • serveWs:处理每个 WebSocket 连接请求,并为每个连接创建一个客户端实例。
  • readPump:从 WebSocket 连接中读取消息,并将消息广播到所有客户端。
  • writePump:负责将消息发送给客户端,并定期发送心跳检测(ping)消息以保持连接。

四、运行项目

  1. 首先,安装 WebSocket 依赖:

    go get github.com/gorilla/websocket
    
  2. 编写前端 HTML 页面(可用于测试),例如 index.html

    <!DOCTYPE html>
    <html lang="en">
    <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Go 聊天室</title>
    </head>
    <body><div id="chatbox"></div><input id="msg" type="text" /><button onclick="sendMessage()">发送</button><script>var ws = new WebSocket("ws://localhost:8080/ws");ws.onmessage = function(event) {var chatbox = document.getElementById('chatbox');chatbox.innerHTML += event.data + "<br/>";};function sendMessage() {var msg = document.getElementById("msg").value;ws.send(msg);}</script>
    </body>
    </html>
    
  3. 运行 Go 服务:

    go run main.go
    
  4. 打开浏览器,访问 index.html,即可体验多人聊天室的功能。

http://www.tj-hxxt.cn/news/329.html

相关文章:

  • 免费提供ppt模板的网站怎么知道网站有没有被收录
  • 做网站余姚北京网站建设公司哪家好
  • 福建省建设继续教育网站推广神器app
  • 模板网站不利于seo吗浅谈一下网络营销的几个误区
  • wordpress css 使用方法谷歌seo推广招聘
  • 个人企业邮箱怎么申请网络优化工程师需要学什么
  • 建站行业成为买方市场腾讯广告投放平台
  • 智慧团建官网登录口入口昆明排名优化
  • 张掖市作风建设年活动网站西安网络科技公司排名
  • 做网站的域名多少钱百度站长工具怎么关闭教程视频
  • 成都网站建设潮州百度账号查询
  • 安庆公司做网站seo免费优化网址软件
  • 免费网站源码大全下载网络推广员的工作内容
  • 当今做那些网站能致富东莞百度seo推广公司
  • 网站开发需要大学吗新浪新闻疫情
  • 两支队伍建设专题网站郑州百度公司地址
  • 开通网站必须做域名空间站长之家seo一点询
  • 在windows azure中部署wordpressseo及网络推广招聘
  • 芜湖网站设计互联网推广的好处
  • 苏州网站定制提高seo关键词排名
  • 自己网站怎么做外链饥饿营销案例
  • 个人网站怎么备案最近一周的国内新闻
  • 晟合建设集团网站最佳的搜索引擎
  • wordpress二手车主题seo搜索优化公司排名
  • 中国五码一级做爰网站营销策划品牌策划
  • 石家庄平山网站推广优化外贸订单怎样去寻找
  • 做购物网站多少钱做百度网站一年多少钱
  • 华秋商城官网搜索引擎优化指的是什么
  • 自己做游戏网站国外推广网站有什么
  • 湖南株洲最新win10最强优化软件