【问题标题】:I need to connect to an existing websocket server using go lang我需要使用 go lang 连接到现有的 websocket 服务器
【发布时间】:2015-12-21 03:12:39
【问题描述】:

在我的本地主机ws://localhost:8080/ws上有一个 websocket 运行

我需要可以创建 websocket 客户端并连接到该服务器的 go lang 代码。

我的 Google-Fu 技能未能教给我一个简单的方法来做到这一点。

谢谢。

【问题讨论】:

  • 您能否提供一个示例链接?我似乎找不到适用于 ping/pong 等的。
  • 我试过 gorilla websocket,但根本没有文档。目前我正在尝试实现 gorilla websocket 客户端。
  • GORilla中有example client
  • 这个例子是几天前才添加的,所以我不知道。谢谢。
  • 我真的很喜欢这里使用的Google-Fu 术语... :-)

标签: go websocket gorilla


【解决方案1】:

没关系,我在网上找到了一些帮助代码。现在我的代码看起来像这样,以防其他人需要:

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 example here 供那些寻求更好解决方案的人使用。

【讨论】:

    【解决方案2】:

    看看这个基于事件的客户端,超级简单: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)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-09
      • 2018-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-23
      相关资源
      最近更新 更多