美文网首页
go实现websocket

go实现websocket

作者: 耍帅oldboy | 来源:发表于2022-10-11 12:41 被阅读0次

用go实现一个简单的websocke的简单demo

1、服务端

package main

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

var UP = websocket.Upgrader{}

var conns []*websocket.Conn
var msg = make(chan string, 20)

func hanlder(w http.ResponseWriter, r *http.Request) {
    conn, err := UP.Upgrade(w, r, nil)
    if err != nil {
        log.Println(err)
        return
    }
    // 保存所有的链接
    msg <- "有人上线:" + fmt.Sprintf("%v", conn.RemoteAddr())
    go broadcast(conns)
    conns = append(conns, conn)
    for {
        _, p, e := conn.ReadMessage()
        if e != nil {
            break
        }
        // 遍历链接,广播发送消息
        msg <- fmt.Sprintf("%v:%s", conn.RemoteAddr(), string(p))
        go broadcast(conns)
    }
    conn.WriteControl(websocket.CloseMessage, []byte("关闭链接"), time.Now().Add(time.Second))
    defer conn.Close()
    log.Println("服务关闭")
}

//广播消息
func broadcast(conns []*websocket.Conn) {
    m := <-msg
    for i := range conns {
        conns[i].WriteMessage(websocket.TextMessage, []byte(m))
    }
}

func main() {
    // websocket接口
    http.HandleFunc("/", hanlder)
    // 通过web接口推送消息
    http.HandleFunc("/msg", func(writer http.ResponseWriter, request *http.Request) {
        // 从body获取消息推送
        //body := request.Body
        //b, _ := io.ReadAll(body)
        //body.Close()
        //fmt.Println(string(b))
        // 从form表单获取消息推送
        b := request.FormValue("msg")
        fmt.Println(b)
        msg <- b
        fmt.Println(conns)
        go broadcast(conns)
        writer.Write([]byte(fmt.Sprintf("%v", "发送成功")))
    })
    http.ListenAndServe(":8000", nil)
}

2、客户端

package main

import (
    "bufio"
    "fmt"
    "github.com/gorilla/websocket"
    "log"
    "os"
)

func main() {
    dl := websocket.Dialer{}
    conn, _, err := dl.Dial("ws://127.0.0.1:8000", nil)
    if err != nil {
        log.Println(err)
        return
    }
    go send(conn)
    for {
        m, p, e := conn.ReadMessage()
        if e != nil {
            break
        }
        fmt.Println(m, string(p))
    }
    defer conn.Close()
}

func send(conn *websocket.Conn) {
    for {
        reader := bufio.NewReader(os.Stdin)
        l, _, _ := reader.ReadLine()
        conn.WriteMessage(websocket.TextMessage, l)
    }
}

3运行的效果

image.png

相关文章

  • go+gin+websocket实现轮询

    go+gin+webSocket实现轮询 js[^webSocket实时获取系统时间] go router ser...

  • 在 go 中实现 websocket 服务

    目标:了解 websocket ,能够使用 golang 来实现 websocket 服务 要求:了解 go 基本...

  • go实现websocket

    用go实现一个简单的websocke的简单demo 1、服务端 2、客户端 3运行的效果

  • go websocket 问题(Hijacker)

    go websocket 问题(Hijacker) 在写websocket包的时候发现一个比较有趣问题!go 使用...

  • Go实现Websocket消息推送

    1.websocket 简介 以往浏览器要获取服务端数据,都是通过发送 HTTP 请求,然后等待服务端回应的。也就...

  • go

    我们使用golang构建websocket,支持高性能、高并发,websocket不用多介绍,go自带原生webs...

  • go websocket

    获得相应包支持:go get golang.org/x/net/websocket 解释:(1)http.Hand...

  • Go语言实现的WebSocket

    最终的效果如下Web端上传的信息Web端得到的打印的信息 WebSocket协议是基于TCP的一种新的网络协议。它...

  • Golang + Socket.io

    在 Go 中使用 Socket.IO The WebSocket Protocol https://tools.i...

  • 2018-10-09 WebSocket通信过程与实现

    来源:WebSocket通信过程与实现 什么是 WebSocket ? WebSocket 是一种标准协议,用于在...

网友评论

      本文标题:go实现websocket

      本文链接:https://www.haomeiwen.com/subject/krzaartx.html