Golang WebSocket实时通信教程
如何在Golang中实现WebSocket的实时通信功能?想找一个完整的教程,最好能包含以下内容:
- 基础的WebSocket连接建立步骤
- 如何处理客户端的连接和断开
- 如何实现服务器和客户端之间的双向消息推送
- 在生产环境中需要注意的性能优化点
- 有没有推荐的第三方库或框架可以简化开发?
最近项目需要这个功能,但网上的教程都比较零散,希望能找到一个系统性的解决方案。
3 回复
以下是一个简单的 Golang WebSocket 实时通信教程:
-
安装依赖:确保已安装
gorilla/websocket
包。go get github.com/gorilla/websocket
-
服务器端代码:
package main import ( "net/http" "github.com/gorilla/websocket" ) var upgrader = websocket.Upgrader{ CheckOrigin: func(r *http.Request) bool { return true }, } func handleConnections(w http.ResponseWriter, r *http.Request) { conn, err := upgrader.Upgrade(w, r, nil) if err != nil { return } defer conn.Close() for { msgType, msg, err := conn.ReadMessage() if err != nil { break } if err := conn.WriteMessage(msgType, msg); err != nil { break } } } func main() { http.HandleFunc("/ws", handleConnections) http.ListenAndServe(":8080", nil) }
-
客户端代码(HTML + JavaScript):
<!DOCTYPE html> <html> <head> <title>WebSocket Test</title> </head> <body> <script> var ws = new WebSocket("ws://localhost:8080/ws"); ws.onmessage = function(event) { console.log("Received: ", event.data); }; ws.onopen = function() { ws.send("Hello Server!"); }; </script> </body> </html>
-
运行服务:
- 启动服务器:
go run server.go
- 打开浏览器访问包含客户端代码的 HTML 文件。
- 启动服务器:
这个示例展示了如何建立 WebSocket 连接并实现简单的消息收发。
更多关于Golang WebSocket实时通信教程的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
作为一个屌丝程序员,我可以分享一个简单的Golang WebSocket实时通信实现。
首先确保安装gorilla/websocket
库:
go get github.com/gorilla/websocket
然后创建服务器端代码 server.go
:
package main
import (
"fmt"
"log"
"net/http"
"github.com/gorilla/websocket"
)
var upgrader = websocket.Upgrader{
CheckOrigin: func(r *http.Request) bool { return true },
}
func handleConnections(w http.ResponseWriter, r *http.Request) {
ws, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Fatal(err)
}
defer ws.Close()
for {
var msg string
err := ws.ReadJSON(&msg)
if err != nil {
log.Printf("error: %v", err)
break
}
fmt.Printf("Received: %s\n", msg)
err = ws.WriteJSON("Pong")
if err != nil {
log.Println(err)
break
}
}
}
func main() {
http.HandleFunc("/ws", handleConnections)
log.Println("Listening on :8080...")
err := http.ListenAndServe(":8080", nil)
if err != nil {
log.Fatal("ListenAndServe: ", err)
}
}
客户端可以用HTML和JavaScript实现:
<!DOCTYPE html>
<script>
let ws = new WebSocket('ws://localhost:8080/ws');
ws.onmessage = function(event) {
console.log('Message from server ', event.data);
};
ws.onopen = function() {
ws.send('Hello Server');
};
</script>
运行服务端并打开网页即可测试。注意处理错误和断开连接的优雅性,生产环境需要更健壮的实现。
Golang WebSocket实时通信教程
WebSocket在Go语言中实现起来非常简洁高效。以下是完整的实现步骤:
1. 安装依赖包
go get github.com/gorilla/websocket
2. 基本服务器实现
package main
import (
"log"
"net/http"
"github.com/gorilla/websocket"
)
var upgrader = websocket.Upgrader{
ReadBufferSize: 1024,
WriteBufferSize: 1024,
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.Println(err)
return
}
defer conn.Close()
for {
messageType, p, err := conn.ReadMessage()
if err != nil {
log.Println(err)
return
}
// 处理消息
log.Printf("收到消息: %s", p)
// 回显消息
if err := conn.WriteMessage(messageType, p); err != nil {
log.Println(err)
return
}
}
}
func main() {
http.HandleFunc("/ws", wsHandler)
log.Fatal(http.ListenAndServe(":8080", nil))
}
3. 客户端HTML示例
<!DOCTYPE html>
<html>
<head>
<title>WebSocket测试</title>
</head>
<body>
<input id="message" type="text">
<button onclick="sendMessage()">发送</button>
<div id="output"></div>
<script>
const socket = new WebSocket("ws://localhost:8080/ws");
socket.onmessage = function(e) {
document.getElementById("output").innerHTML += e.data + "<br>";
};
function sendMessage() {
const msg = document.getElementById("message").value;
socket.send(msg);
document.getElementById("message").value = "";
}
</script>
</body>
</html>
进阶用法
- 广播消息给所有客户端:
var clients = make(map[*websocket.Conn]bool)
func broadcast(message []byte) {
for client := range clients {
err := client.WriteMessage(websocket.TextMessage, message)
if err != nil {
client.Close()
delete(clients, client)
}
}
}
- 处理连接关闭:
func wsHandler(w http.ResponseWriter, r *http.Request) {
conn, _ := upgrader.Upgrade(w, r, nil)
defer conn.Close()
// 注册客户端
clients[conn] = true
for {
_, msg, err := conn.ReadMessage()
if err != nil {
delete(clients, conn)
break
}
broadcast(msg)
}
}
这就是Go语言实现WebSocket实时通信的基本方法。你可以在此基础上扩展更多功能,如JSON消息处理、心跳检测等。