当前位置:   article > 正文

Go 实现 WebSocket 的双向通信

Go 实现 WebSocket 的双向通信

在Go语言中实现WebSocket的双向通信通常需要使用第三方库,其中 gorilla/websocket 是一个非常流行和广泛使用的库。

1、安装

go get github.com/gorilla/websocket

2、编写WebSocket服务器代码

  1. package main
  2. import (
  3. "fmt"
  4. "github.com/gorilla/websocket"
  5. "log"
  6. "net/http"
  7. )
  8. var upgrader = websocket.Upgrader{
  9. ReadBufferSize: 1024,
  10. WriteBufferSize: 1024,
  11. CheckOrigin: func(r *http.Request) bool {
  12. // 允许所有来源的WebSocket连接
  13. return true
  14. },
  15. }
  16. func handleConnection(w http.ResponseWriter, r *http.Request) {
  17. // 升级HTTP连接为WebSocket连接
  18. conn, err := upgrader.Upgrade(w, r, nil)
  19. if err != nil {
  20. log.Println("升级到WebSocket连接时出错:", err)
  21. return
  22. }
  23. defer conn.Close()
  24. log.Println("客户端已连接")
  25. // 读取客户端发来消息
  26. for {
  27. messageType, p, err := conn.ReadMessage()
  28. if err != nil {
  29. log.Println("从客户端读取时出错:", err)
  30. return
  31. }
  32. // 处理消息
  33. log.Printf("这是客户端发来的信息:%s-------------消息类型%v", string(p), messageType)
  34. // 发送消息给客户端
  35. err = conn.WriteMessage(messageType, []byte("你好!我是server端。。。"))
  36. if err != nil {
  37. fmt.Println(err)
  38. return
  39. }
  40. }
  41. }
  42. func main() {
  43. //创建一个HTTP服务器,当有请求过来时交给handleConnection处理
  44. http.HandleFunc("/ws", handleConnection)
  45. // 启动WebSocket服务器
  46. log.Println("WebSocket服务器正在侦听:8080")
  47. err := http.ListenAndServe(":8080", nil)
  48. if err != nil {
  49. log.Println("WebSocket服务器正在侦听出错", err)
  50. }
  51. }

 3、编写WebSocket客户端代码

  1. package main
  2. import (
  3. "github.com/gorilla/websocket"
  4. "log"
  5. "os"
  6. "os/signal"
  7. "time"
  8. )
  9. func main() {
  10. interrupt := make(chan os.Signal, 1)
  11. signal.Notify(interrupt, os.Interrupt) //使用signal.Notify监听os.Interrupt信号(通常是Ctrl+C产生的中断信号)
  12. u := "ws://localhost:8080/ws"
  13. log.Printf("连接到服务器 %s", u)
  14. c, _, err := websocket.DefaultDialer.Dial(u, nil) //试连接到WebSocket服务器
  15. if err != nil {
  16. log.Fatal("失败:", err)
  17. }
  18. defer c.Close()
  19. done := make(chan struct{})
  20. go func() {
  21. defer close(done)
  22. //无限循环读取从WebSocket服务器发送的消息
  23. for {
  24. messageType, message, err := c.ReadMessage()
  25. if err != nil {
  26. log.Println("读取失败:", err)
  27. return
  28. }
  29. log.Printf("这是服务器端发来的信息: %s--------------消息类型:%v", message, messageType)
  30. }
  31. }()
  32. ticker := time.NewTicker(2 * time.Second) //创建一个定时器,每2秒触发一次
  33. defer ticker.Stop()
  34. for {
  35. select {
  36. case <-done:
  37. return
  38. case <-ticker.C: //定时候定时触发
  39. //向WebSocket服务端发送消息
  40. //websocket.TextMessage指定消息类型为文本消息
  41. //t.String()将定时器的当前值转换为字符串,然后通过[]byte(t.String())转换为字节切片,作为消息的内容发送。
  42. err := c.WriteMessage(websocket.TextMessage, []byte("你好!我是client端。。。"))
  43. if err != nil {
  44. log.Println("向WebSocket服务端发送消息出错:", err)
  45. return
  46. }
  47. case <-interrupt:
  48. log.Println("接收到中断信号")
  49. // 关闭连接
  50. err := c.WriteMessage(websocket.CloseMessage, websocket.FormatCloseMessage(websocket.CloseNormalClosure, ""))
  51. if err != nil {
  52. log.Println("关闭输入:", err)
  53. return
  54. }
  55. select {
  56. case <-done:
  57. case <-time.After(time.Second):
  58. }
  59. return
  60. }
  61. }
  62. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/641749
推荐阅读
相关标签
  

闽ICP备14008679号