【问题标题】:Golang websocket client, close connection after getting resultGolang websocket客户端,得到结果后关闭连接
【发布时间】:2017-10-06 04:00:27
【问题描述】:

我如何实现这种场景:

1.我有 LoginHandler 接收一些用户数据 - 电子邮件和 signedXml:

func LoginHandler(c *gin.Context) {
    var (
        err  error
        data LoginPost
    )
    if err = c.BindJSON(&data); err != nil {
        c.JSON(http.StatusBadRequest, gin.H{"status": "error"})
        return
    }

    ...

    c.JSON(http.StatusOK, gin.H{"status": "ok"})
}

2.我需要通过websocket将signedXml发送到另一台服务器

3.保存结果(成功或错误)

4.关闭连接

每个 HTTP 请求都会打开连接,发送 1 条消息,获得 1 个结果,最后关闭套接字。我正在尝试使用频道,但没有成功。这可以实现我的案例吗?

更新

package main

import (
    "log"
    "net/url"

    "github.com/gorilla/mux"
    "github.com/gorilla/websocket"
    "net/http"
)

func indexHandler(w http.ResponseWriter, r *http.Request) {
    message := r.FormValue("message")
    w.Write([]byte(message))
}

func postHandler(w http.ResponseWriter, r *http.Request) {
    var (
        message = r.FormValue("message")
        u = url.URL{Scheme: "ws", Host: "echo.websocket.org", Path: "/"}
        err error
        out []byte
        conn *websocket.Conn
    )
    log.Printf("message: %s\n", message)
    log.Printf("connecting to %s\n", u.String())
    conn, _, err = websocket.DefaultDialer.Dial(u.String(), nil)
    if err != nil {
        log.Fatal("dial:", err)
    }
    log.Println("write")
    if err = conn.WriteMessage(websocket.TextMessage, []byte(message)); err != nil {
        log.Fatal("write:", err)
    }
    log.Println("read")
    if _, out, err = conn.ReadMessage(); err != nil {
        log.Fatal("read:", err)
    }
    w.Write(out)
    log.Println("close")
    conn.Close()
}

func main() {
    r := mux.NewRouter()
    r.HandleFunc("/", indexHandler).Methods("GET")
    r.HandleFunc("/post", postHandler).Methods("POST")
    http.Handle("/", r)
    http.ListenAndServe(":8080", nil)
}

【问题讨论】:

  • 你能改变其他服务器吗? Websockets 似乎并不适合这种情况。
  • Dial 连接,write a messageread 一条消息,然后close 连接。无需使用频道。显示您到目前为止尝试过的内容。
  • 我尝试了来自github.com/gorilla/websocket/blob/master/examples/echo/… 的示例。但他们会一直听,直到收到中断信号,然后关闭连接。我如何在没有通道和 for-select 语句的情况下重写该示例?

标签: go websocket gorilla


【解决方案1】:

依次调用DialWriteMessageReadMessageClose

c, _, err := websocket.DefaultDialer.Dial(url, nil)
if err != nil {
    // handle error
}
err := c.WriteMessage(websocket.TextMessage, signedXML)
if err != nil {
     // handle error
}
_, p, err := c.ReadMessage()
if err != nil {
     // handle error
}
c.Close()

// p is a []byte with the first received message.

【讨论】:

  • 我测试了上面的代码(更新*),它在conn.ReadMessage()之后冻结了
  • 更新中的代码对我有用。 curl -d message=hello http://localhost:8080/post 打印 hello.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-25
  • 1970-01-01
  • 2017-06-06
  • 1970-01-01
  • 2020-10-25
  • 2013-10-17
  • 1970-01-01
相关资源
最近更新 更多