当前位置: 首页 > article >正文

golang使用Websocket实例

本项目使用 github.com/gorilla/websocket 库 安装:

go get github.com/gorilla/websocket

服务端代码

package main

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

func WebSocketServer() {
	addr := "localhost:8002"
	http.HandleFunc("/wshandler", WebSocketUpgrade)
	log.Println("Starting websocket server at " + addr)

	go func() {
		err := http.ListenAndServe(addr, nil)
		if err != nil {
			log.Fatal(err)
		}
	}()

	log.Println("WebSocket 服务器正在运行。按Ctrl+C退出")
	select {}
}

func WebSocketUpgrade(resp http.ResponseWriter, req *http.Request) {
	// 初始化 Upgrader
	upgrader := websocket.Upgrader{
		ReadBufferSize:  1024,
		WriteBufferSize: 1024,
		CheckOrigin: func(r *http.Request) bool {
			return true
		},
	} // 使用默认的选项
	// 第三个参数是响应头,默认会初始化
	conn, err := upgrader.Upgrade(resp, req, nil)
	if err != nil {
		log.Println(err)
		return
	}
	defer conn.Close()

	// 读取客户端的发送额消息,并返回
	fmt.Println("websocket 连接成功")
	// fmt.Println(conn)
	go ReadMessage(conn)
	select {}
}

// 读取客户端发送的消息,并返回
func ReadMessage(conn *websocket.Conn) {
	for {
		// 消息类型:文本消息和二进制消息
		messageType, msg, err := conn.ReadMessage()
		if err != nil {
			log.Println(err)
			return
		}
		fmt.Println("receive msg:", string(msg))

		err = conn.WriteMessage(messageType, []byte("The server has received the message"))
		if err != nil {
			log.Println("write error:", err)
			return
		}
	}
}

func main() {
	WebSocketServer()
}

客户端

package main

import (
	"encoding/json"
	"fmt"
	"log"
	"time"
	"github.com/gorilla/websocket"
)

func main() {
	wsUrl := "ws://localhost:8002/wshandler"
	// 连接WebSocket服务器
	conn, _, err := websocket.DefaultDialer.Dial(wsUrl, nil)
	if err != nil {
		log.Println(err)
		return
	}

	log.Println("连接成功")

	go func() {
		for {
			// 读取消息
			messageType, message, err := conn.ReadMessage()
			if err != nil {
				log.Fatal(err)
			}
			log.Println("消息类型:", messageType, "消息数据:", string(message))
		}
	}()

	// 发送消息
	controlMessage := map[string]interface{}{
		"type": "control",
		"data": "hello word",
	}
	jsonData, err := json.Marshal(controlMessage)
	if err != nil {
		fmt.Println("Error marshalling JSON:", err)
		return
	}

	// 间隔2秒发送一次消息
	ticket := time.NewTicker(2 * time.Second)
	defer ticket.Stop()
	for {
		<-ticket.C
		// 2. 发送消息
		err = conn.WriteMessage(websocket.TextMessage, []byte(string(jsonData)))
		if err != nil {
			log.Fatal(err)
		}
		log.Println("发送消息成功")
	}

}


http://www.kler.cn/a/488563.html

相关文章:

  • 【渗透测试术语总结】
  • C++例程:使用I/O模拟IIC接口(6)
  • 4 $ 符号
  • 基于SpringBoot的洗浴管理系统
  • 初学者关于对机器学习的理解
  • 【深度学习】深度(Deep Learning)学习基础
  • 【Python】Python与C的区别
  • Python AI教程之十六:监督学习之决策树(7)和其它算法的比较
  • 图像处理|腐蚀操作
  • 【PPT解密】ppt只读文档怎么改成可编辑文档
  • CAPL语法基础
  • 记录一次Android Studio的下载、安装、配置
  • 自动化元素定位时,发现提示找不到元素,怎么处理?
  • java中 如何从jar中读取资源文件?
  • PDF如何提取文字?OCR技术快速识别提取PDF中的文字内容!这种简单方法一定要知道!
  • 【STM32+CubeMX】 新建一个工程(STM32F407)
  • 【权限管理】Apache Shiro学习教程
  • SpringBoot的@Scheduled和@Schedules有什么区别
  • 腾讯云AI代码助手编程挑战赛-可视化飞线图
  • priority_queue优先队列
  • 用AI技术提升Flutter开发效率:ScriptEcho的力量
  • NFC碰一碰发视频源码搭建,支持OEM
  • 0052.基于Springboot+vue社区团购系统+论文
  • Redis 全维度深度剖析:从基础架构到实战应用
  • Vue页面开发和脚手架开发 Vue2集成ElementUI Vue3集成Element Plus
  • 手机的ip地址是根据电话卡归属地定吗