我需要使用Go语言连接到一个现有的WebSocket服务器。

14

我的本地主机上运行着一个WebSocket,地址是 ws://localhost:8080/ws

我需要一段 Go 代码,可以创建 WebSocket 客户端并连接到该服务器。

我的 Google 搜索技能无法教会我如何简单完成此操作。

谢谢。


请问您能否提供一个带有示例的链接?我似乎找不到一个适用于 ping/pong 等的。 - SudoPlz
我尝试了Gorilla WebSocket,但是完全没有文档。目前我正在尝试实现Gorilla WebSocket客户端。 - SudoPlz
2
在 Gorilla 中有一个名为 example client 的客户端。 - recoba
1
这个例子是几天前添加的,所以我不知道。谢谢。 - SudoPlz
3
我非常喜欢在这里使用的“Google-Fu”这个词。 :-) - tgogos
2个回答

21

没关系,我在网上找到了一些有用的代码。现在我的代码如下,以防其他人需要:

package main

import (
        "net/http"
        "text/template"
        "code.google.com/p/go.net/websocket"
        "fmt"
        "os"
        "time"
)


const address string = "localhost:9999"

func main() {

    initWebsocketClient()
}


func initWebsocketClient() {
    fmt.Println("Starting Client")
    ws, err := websocket.Dial(fmt.Sprintf("ws://%s/ws", address), "", fmt.Sprintf("http://%s/", address))
    if err != nil {
        fmt.Printf("Dial failed: %s\n", err.Error())
        os.Exit(1)
    }
    incomingMessages := make(chan string)
    go readClientMessages(ws, incomingMessages)
    i := 0
    for {
        select {
        case <-time.After(time.Duration(2e9)):
            i++
            response := new(Message)
            response.RequestID = i
            response.Command = "Eject the hot dog."
            err = websocket.JSON.Send(ws, response)
            if err != nil {
                fmt.Printf("Send failed: %s\n", err.Error())
                os.Exit(1)
            }
        case message := <-incomingMessages:
            fmt.Println(`Message Received:`,message)


        }
    }
}

func readClientMessages(ws *websocket.Conn, incomingMessages chan string) {
    for {
        var message string
        // err := websocket.JSON.Receive(ws, &message)
        err := websocket.Message.Receive(ws, &message)
        if err != nil {
            fmt.Printf("Error::: %s\n", err.Error())
            return
        }
        incomingMessages <- message
    }
}

正如评论中recoba所建议的那样,对于那些寻找更好解决方案的人来说,这里有一个新的gorilla示例


感谢提供这个示例。这里的“Message”是什么? - dsha256

6

来看一下这个基于事件的客户端,非常容易使用:https://github.com/rgamba/evtwebsocket

示例:

package main

import (
    "fmt"

    "github.com/rgamba/evtwebsocket"

    "golang.org/x/net/websocket"
)

func main() {
  c := evtwebsocket.Conn{
    OnConnected: func(w *websocket.Conn) {
        fmt.Println("Connected")
    },
    OnMessage: func(msg []byte) {
        fmt.Printf("Received message: %s\n", msg)
    },
    OnError: func(err error) {
        fmt.Printf("** ERROR **\n%s\n", err.Error())
    },
  }
  // Connect
  c.Dial("ws://echo.websocket.org")
  c.Send([]byte("TEST"), nil)
}

代码无法运行,请在此游乐场检查 https://go.dev/play/p/SVUJSJxw0eZ - supa pati

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接