4.网络编程-websocket(golang)

目录

什么是websocket

golang中使用websocket

Server端

Client端


什么是websocket

WebSocket是一种在互联网上提供全双工通信的协议,即允许服务器和客户端之间进行双向实时通信的网络技术。它是作为HTML5的一部分标准化的,旨在解决传统HTTP协议在实时性、长连接方面存在的不足。

以下是WebSocket的主要特点和工作方式:

  1. 双向通信:不同于HTTP请求-响应模式的单向通信,WebSocket允许服务器和浏览器(或客户端)都能发起数据传输,实现实时的数据交互。

  2. 持久连接:一旦WebSocket握手成功建立,浏览器和服务器之间会保持一个持续打开的TCP连接,无需为每个数据包都重新建立连接。

  3. 基于TCP:WebSocket协议是基于TCP的,确保了数据可靠传输。

  4. 轻量级协议:虽然WebSocket握手阶段借用了一些HTTP的概念,但随后的数据传输则采用专有的简洁二进制帧格式,有效减少了头部开销,更适合实时通信场景。

  5. 事件驱动:WebSocket API是事件驱动的,开发者可以通过监听各种事件(如open、message、error、close)来处理连接状态变化和数据接收。

  6. 低延迟:由于避免了HTTP的"请求-响应"循环,WebSocket能够减少不必要的延迟,对于实时聊天、游戏、股票报价、协同编辑等应用场景尤为适用。

WebSocket的工作流程始于一次特殊的HTTP请求,通过升级协议(Upgrade)头信息,客户端请求将HTTP连接转换为WebSocket连接。如果服务器同意升级,那么双方就进入WebSocket协议的通信阶段,直至连接关闭为止。

golang中使用websocket

在Go语言中使用WebSocket,您可以使用第三方库如github.com/gorilla/websocket来实现。以下是一个基本的WebSocket服务器端和客户端示例:

bash 复制代码
go get -u github.com/gorilla/websocket

Server端

Go 复制代码
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 // 允许所有源,生产环境中应根据需要设置更严格的CORS策略
	},
}

func serveWs(w http.ResponseWriter, r *http.Request) {
	conn, err := upgrader.Upgrade(w, r, nil)
	if err != nil {
		log.Println("Failed to set up WebSocket connection:", err)
		return
	}
	defer conn.Close()

	for {
		// 读取客户端发送的消息
		msgType, msg, err := conn.ReadMessage()
		if err != nil {
			log.Println("Failed to read WebSocket message:", err)
			break
		}

		log.Printf("Received message from client: %s", msg)

		// 假设我们只是简单地将接收到的消息回传给客户端
		err = conn.WriteMessage(msgType, msg)
		if err != nil {
			log.Println("Failed to send WebSocket message:", err)
			break
		}
	}
}

func main() {
	http.HandleFunc("/ws", serveWs)
	log.Println("Starting WebSocket server on :8080...")
	err := http.ListenAndServe(":8080", nil)
	if err != nil {
		log.Fatal("Error starting server:", err)
	}
}

Client端

Go 复制代码
package main

import (
	"github.com/gorilla/websocket"
	"log"
	"net/url"
)

func main() {
	u := url.URL{Scheme: "ws", Host: "localhost:8080", Path: "/ws"}
	log.Printf("Connecting to %s", u.String())

	c, _, err := websocket.DefaultDialer.Dial(u.String(), nil)
	if err != nil {
		log.Fatal("Failed to connect to WebSocket server:", err)
	}
	defer c.Close()

	err = c.WriteMessage(websocket.TextMessage, []byte("Hello from client!"))
	if err != nil {
		log.Println("Failed to send message:", err)
		return
	}

	_, msg, err := c.ReadMessage()
	if err != nil {
		log.Println("Failed to receive message:", err)
		return
	}

	log.Printf("Received message from server: %s", msg)
}

在这个简单的示例中,服务器端创建了一个WebSocket升级器(upgrader),用于将HTTP请求升级为WebSocket连接。当客户端连接到/ws端点时,服务器端会创建一个新的WebSocket连接并进入一个无限循环,不断地读取客户端发送的消息并将其回传给客户端。

客户端则使用默认的Dialer连接到服务器,发送一条消息("Hello from client!"),然后接收并打印来自服务器的回复。在实际应用中,您需要根据需求扩展和定制这些基础功能,例如处理不同类型的WebSocket消息、实现消息广播、连接管理等。

相关推荐
裕晟资质规划6 小时前
三类资质变更报告时限差在哪?军工 15 日、集成印制 10 日
大数据·服务器·网络
9624566 小时前
Go EVM 链上数据平台实践:从 RPC Demo 到可演进架构
rpc·架构·golang
轻舟技术A6 小时前
Provider 不属于 Agent 核心:rpi 的分层理由与收益
服务器·网络
Escalating_xu7 小时前
【Linux 网络编程】TCP Socket 编程(上):从 listen、accept 到完整回显通信
linux·网络·tcp/ip
NetX行者7 小时前
Python 工程化入门:从脚本到规范的 Python 项目结构
网络·python
Yang96117 小时前
从相位噪声到实时带宽:HD-063B支撑的频谱实验项目
网络
happyprince7 小时前
01-整体观-DeepSeek-V4.1-Flash全貌解读
网络
是真的小外套7 小时前
2023年软考中级信息安全工程师|选择题考点+5道案例分析真题解析(含答案)
java·服务器·网络
一条泥憨鱼9 小时前
【计算机网络】| 从 MAC 到 NAT 的跨网段通信全链路
服务器·网络·学习·计算机网络·macos
Moyu_Friday9 小时前
网络安全基础-计算机网络应用与协议
网络协议·计算机网络