Golang WebSocket实时通信教程

如何在Golang中实现WebSocket的实时通信功能?想找一个完整的教程,最好能包含以下内容:

  1. 基础的WebSocket连接建立步骤
  2. 如何处理客户端的连接和断开
  3. 如何实现服务器和客户端之间的双向消息推送
  4. 在生产环境中需要注意的性能优化点
  5. 有没有推荐的第三方库或框架可以简化开发?

最近项目需要这个功能,但网上的教程都比较零散,希望能找到一个系统性的解决方案。

3 回复

以下是一个简单的 Golang WebSocket 实时通信教程:

  1. 安装依赖:确保已安装 gorilla/websocket 包。

    go get github.com/gorilla/websocket
    
  2. 服务器端代码

    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)
    }
    
  3. 客户端代码(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>
    
  4. 运行服务

    • 启动服务器: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>

进阶用法

  1. 广播消息给所有客户端:
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)
        }
    }
}
  1. 处理连接关闭:
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消息处理、心跳检测等。

回到顶部