go 实现websocket 通信

// 模拟客户端发送消息
package main

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

func main() {
    // 客户端建立与websocket连接
    conn, _, err := websocket.DefaultDialer.Dial("ws://localhost:8080/ws", nil)
    if err != nil {
        log.Fatal(err)
    }
    defer conn.Close()
    //  发送消息到服务端
    message := []byte("123456")
    if err := conn.WriteMessage(websocket.TextMessage, message); err != nil {
        log.Fatal(err)
    }
    //  设置读取服务端push消息超时时间
    conn.SetReadDeadline(time.Now().Add(60 * time.Second))
    // 循环读取消息
    for {
        _, p, err := conn.ReadMessage()
        if err != nil {
            log.Fatal(err)
        }
        log.Println(err)

        log.Println(string(p))
    }
}


package main
import (
    "fmt"
    "log"
    "net/http"
    "strconv"
    "time"
    "github.com/gorilla/websocket"
)

var upgrader = websocket.Upgrader{
    ReadBufferSize:  1024,
    WriteBufferSize: 1024,
}

func main() {
    // 创建websocket 地址及监听端口
    http.HandleFunc("/", home)
    http.HandleFunc("/ws", wsEndpoint)

    log.Println("Server started on :8080")
    log.Fatal(http.ListenAndServe(":8080", nil))
}

func home(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "WebSocket Server")
}

func wsEndpoint(w http.ResponseWriter, r *http.Request) {
    /*
      在Gorilla Websocket库中,使用upgrader.Upgrade(w, r, nil)方法将HTTP连接升级为Websocket连接,
      其中w是一个http.ResponseWriter对象,r是一个*http.Request对象,nil表示不需要额外的头部信息。
      upgrader.Upgrade方法返回两个值,分别是*websocket.Conn对象和error对象。
      *websocket.Conn对象表示Websocket连接,可以通过这个对象进行消息的发送和接收。
      error对象表示升级过程中是否出现了错误,如果出现错误,可以通过error对象获取错误信息
    */
    conn, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        log.Println(err)
    }
    log.Println("Client Connected")
    //  设置读取客户端消息超时时间

    conn.SetReadDeadline(time.Now().Add(30 * time.Second))

    messageType, p, err := conn.ReadMessage()
    log.Println(p)
    if err != nil {
        if websocket.IsUnexpectedCloseError(err, websocket.CloseGoingAway, websocket.CloseAbnormalClosure) {
            log.Printf("error: %v", err)
        }
        return
    }
     if messageType == websocket.TextMessage {
        // 将接收到的字符串消息解析为整数
        num, err := strconv.Atoi(string(p))
        log.Println(num)
        if err != nil {
            log.Println(err)
            return
        }
        // 设置发送客户端消息超时时间
        conn.SetWriteDeadline(time.Now().Add(30 * time.Second))
        for i := 1; i <= 10; i++ {
            err = conn.WriteMessage(websocket.TextMessage, []byte(fmt.Sprintf("%d", i)))
            if err != nil {
                log.Println(err)
                return
            }

            // 暂停1秒钟
            time.Sleep(time.Second)

            // 如果达到指定次数,则退出循环
            if i == num {
                break
            }
        }

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值