go 实现websocket

要在Go语言中实现WebSocket功能,您可以使用标准库net/http中的websocket包或者第三方库如github.com/gorilla/websocketgithub.com/gobwas/ws。以下是一个使用标准库net/http的WebSocket简单示例,展示如何创建一个WebSocket服务器以及如何处理客户端连接和消息收发:

1. 安装依赖(仅适用于第三方库) 如果使用第三方库,如github.com/gorilla/websocket,请先安装:

 

bash

go get github.com/gorilla/websocket

2. 创建WebSocket服务器

使用标准库net/http实现WebSocket服务器:

 

go

package main

import (
	"log"
	"net/http"
	"time"

	"github.com/gorilla/websocket" // 若使用第三方库gorilla/websocket,取消注释并引入此行
)

var upgrader = websocket.Upgrader{} // 使用gorilla/websocket时使用此行

func serveWS(w http.ResponseWriter, r *http.Request) {
	// 使用标准库net/http
	c, err := (&websocket.Upgrader{}).Upgrade(w, r, nil) // 使用标准库时使用此行
	// 使用gorilla/websocket库
	// c, err := upgrader.Upgrade(w, r, nil) // 使用gorilla/websocket时使用此行
	if err != nil {
		log.Println("Upgrade:", err)
		return
	}
	defer c.Close()

	for {
		// Read message from client
		mt, message, err := c.ReadMessage()
		if err != nil {
			log.Println("Read:", err)
			break
		}
		log.Printf("Received: %s", message)

		// Send a reply back to client
		err = c.WriteMessage(mt, []byte("Hello, you said: "+string(message)))
		if err != nil {
			log.Println("Write:", err)
			break
		}

		// Optionally introduce a delay or other processing before sending the reply
		time.Sleep(1 * time.Second)
	}
}

func main() {
	http.HandleFunc("/ws", serveWS)
	log.Println("Listening on :8080...")
	err := http.ListenAndServe(":8080", nil)
	if err != nil {
		log.Fatal("ListenAndServe:", err)
	}
}

示例说明:

  • serveWS函数作为HTTP处理器,被注册到"/ws"路由上。
  • 当客户端发起WebSocket连接请求时,(&websocket.Upgrader{}).Upgrade()函数将HTTP连接升级为WebSocket连接。
  • 在升级成功后,服务器进入一个无限循环,持续读取客户端发送的消息(c.ReadMessage())。
  • 每次收到消息后,服务器将消息内容打印到日志,并发送一条回复消息给客户端(c.WriteMessage()),回复消息包含客户端发送的内容前缀加上固定的文本。
  • 如果在读取或写入消息过程中发生错误,服务器将断开连接并退出循环。

如果您选择使用第三方库如github.com/gobwas/ws或有其他特定需求(如心跳检测、并发管理、消息分发等),对应的实现细节会有所不同,但基本的连接升级、消息读写逻辑是相似的。请查阅所选库的官方文档以获取更详细的使用指南和示例代码。

  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三希

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值