2017-10-05 90 views
0

后,紧密结合我怎样才能实现这种情景:Golang的WebSocket客户端,让结果

1.I有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.I需要通过WebSocket的发送signedXml到另一台服务器

3.Save结果(成功或错误)

4.Close连接

每个HTTP请求都会打开连接,发送1条消息,得到1条结果,最后关闭套接字。我正在尝试与频道,但没有成功。这是可能实现我的情况?

UPDATE

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) 
} 
+0

你能改变其他服务器吗? Websockets似乎并不适合这种情况。 – Gavin

+0

[拨号](https://godoc.org/github.com/gorilla/websocket#Dialer.Dial)连接,[写信息](https://godoc.org/github.com/gorilla/websocket# Conn.WriteMessage),[阅读](https://godoc.org/github.com/gorilla/websocket#Conn.ReadMessage)消息,然后[关闭](https://godoc.org/github.com/gorilla /websocket#Conn.Close)连接。没有必要使用频道。显示你到目前为止所尝试的。 –

+0

我试过https://github.com/gorilla/websocket/blob/master/examples/echo/client.go中的例子。但是他们听,直到中断信号收到,然后关闭连接。如何在没有渠道和选择陈述的情况下重写该示例? –

回答

0

呼叫DialWriteMessageReadMessage和序列Close

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. 
+0

我测试了上面的代码(UPDATE *),并在'conn.ReadMessage()'后面冻结' –

+0

更新中的代码适用于我。 'curl -d message = hello http:// localhost:8080/post'打印'hello'。 –