答案:使用Golang和gorilla/websocket库可实现一个简单的WebSocket聊天室,通过HTTP服务升级连接、管理客户端并广播消息。首先安装gorilla/websocket库,创建/ws路由并用Upgrader升级为WebSocket连接,允许跨域;接着定义clients映射和broadcast通道,用RWMutex保证并发安全,在wsHandler中注册连接并读取消息发送至广播通道;然后在main函数中启动handleBroadcast协程,循环监听broadcast并将消息写入所有活跃连接,出错时关闭连接并从clients中删除;最后编写HTML页面测试,多个浏览器窗口可实时收发消息,完成基础聊天功能。

用Golang实现一个简单的WebSocket聊天室服务,核心在于使用gorilla/websocket库建立长连接,并通过广播机制让所有客户端实时收发消息。整个服务不需要前端框架,后端即可完成连接管理与消息分发。
1. 安装依赖并初始化WebSocket服务
Go语言中操作WebSocket最常用的库是gorilla/websocket。先通过以下命令安装:
go get github.com/gorilla/websocket
然后创建一个HTTP服务,将特定路径(如/ws)升级为WebSocket连接:
代码示例:
创建main.go文件:
package main
import (
“log”
“net/http”
“github.com/gorilla/websocket”
)
var upgrader = websocket.Upgrader{
CheckOrigin: func(r *http.Request) bool { return true }, // 允许跨域
}
func wsHandler(w http.ResponseWriter, r *http.Request) {
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Printf(“升级失败: %v”, err)
return
}
defer conn.Close()
log.Println(“新客户端已连接”)
// 简单回显测试
for {
_, msg, err := conn.ReadMessage()
if err != nil {
log.Printf(“读取消息错误: %v”, err)
break
}
log.Printf(“收到消息: %s”, msg)
conn.WriteMessage(websocket.TextMessage, []byte(“echo: “+string(msg)))
}
}
func main() {
http.HandleFunc(“/ws”, wsHandler)
log.Println(“服务启动在 :8080”)
log.Fatal(http.ListenAndServe(“:8080”, nil))
}
2. 实现客户端连接管理
聊天室需要维护多个客户端连接。可以定义一个Client结构体和一个全局的clients集合来管理活跃连接。
立即学习“go语言免费学习笔记(深入)”;
使用map[*websocket.Conn]bool存储连接,并用互斥锁保护并发安全。
var (
clients = make(map[*websocket.Conn]bool)
broadcast = make(chan Message)
mu sync.RWMutex
)
type Message struct {
Data string json:"data"
}
在wsHandler中注册新连接,并将其加入clients:
func wsHandler(w http.ResponseWriter, r *http.Request) {
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
return
}
defer conn.Close()
mu.Lock()
clients[conn] = true
mu.Unlock()
for {
_, msg, err := conn.ReadMessage()
if err != nil {
break
}
broadcast }
mu.Lock()
delete(clients, conn)
mu.Unlock()
}
3. 广播消息给所有在线用户
启动一个独立的广播协程,在main函数中监听broadcast通道,把接收到的消息发送给每一个当前连接的客户端。
func main() {
http.HandleFunc(“/ws”, wsHandler)
go handleBroadcast()
log.Println(“聊天室服务运行在 :8080”)
log.Fatal(http.ListenAndServe(“:8080”, nil))
}
func handleBroadcast() {
for {
msg := data := []byte(msg.Data)
mu.RLock()
for conn := range clients {
err := conn.WriteMessage(websocket.TextMessage, data)
if err != nil {
log.Printf(“发送失败: %v”, err)
conn.Close()
mu.Lock()
delete(clients, conn)
mu.Unlock()
}
}
mu.RUnlock()
}
}
4. 测试聊天室功能
写一个简单的HTML页面测试聊天功能:
a style=”color:#f60; text-decoration:underline;” title= “html”href=”https://www.php.cn/zt/15763.html” target=”_blank”>html>
const ws = new WebSocket(“ws://localhost:8080/ws”);
ws.onmessage = function(event) {
const li = document.createElement(“li”);
li.textContent = event.data;
document.getElementById(“logs”).appendChild(li);
};
function send() {
const input = document.getElementById(“msg”);
ws.send(input.value);
input.value = “”;
}
打开多个浏览器窗口,输入消息点击发送,所有客户端都能实时看到内容。
基本上就这些。这个简单聊天室实现了连接管理、消息广播和基础异常处理,适合学习WebSocket通信模型。后续可扩展用户名、房间、私聊等功能。
以上就是Golang实现简单聊天室WebSocket服务的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1409186.html
微信扫一扫
支付宝扫一扫