2017-10-05 21 views
0

を取得した後、近くの接続、電子メールやsignedXmlGolang用WebSocketクライアント、結果

1.Iは、一部のユーザデータを受信LoginHandlerを持っていますWebSocketを介して他のサーバに

3.Save結果(成功またはエラー)signedXmlを送信する必要があり

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

他のサーバーを変更できますか? WebSocketは実際にはこのような状況には適切ではないようです。 – Gavin

+0

[ダイヤル](https://godoc.org/github.com/gorilla/websocket#Dialer.Dial)接続、[メッセージを書く](https://godoc.org/github.com/gorilla/websocket# Conn.WriteMessage)、[read](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

私は上記のコードをテストしました。(更新*)、 'conn.ReadMessage()'の後にフリーズします。 –

+0

アップデートのコードは私の仕事です。 'curl -d message = hello http:// localhost:8080/post'は' hello'を出力します。 –

関連する問題