亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

成功連接 webscoket 后如何向特定 URI 發送消息?

成功連接 webscoket 后如何向特定 URI 發送消息?

Go
Qyouu 2022-05-18 09:35:33
我有一個在 localhost:443/server-demo (jetty websocket 服務器)上運行的安全 websocket 服務器?,F在我正在編寫一個可以與 websocket 服務器通信的 go 客戶端。我能夠使用正確的證書連接到 websocket 服務器。這是示例代碼。package mainimport (    "crypto/tls"    "crypto/x509"    "fmt"    "io"    "log")func main() {    cert, err := tls.LoadX509KeyPair("nifi-1.10.0-bin/nifi-1.10.0/extras/gen-certs/certs/admin.pem", "nifi-1.10.0-bin/nifi-1.10.0/extras/gen-certs/certs/admin-key.pem")    if err != nil {        log.Fatalf("server: loadkeys: %s", err)    }    config := tls.Config{Certificates: []tls.Certificate{cert}, InsecureSkipVerify: true}    conn, err := tls.Dial("tcp", "127.0.0.1:443", &config)    if err != nil {        log.Fatalf("client: dial: %s", err)    }    defer conn.Close()    log.Println("client: connected to: ", conn.RemoteAddr())    state := conn.ConnectionState()     for _, v := range state.PeerCertificates {        fmt.Println(x509.MarshalPKIXPublicKey(v.PublicKey))        fmt.Println(v.Subject)    }    log.Println("client: handshake: ", state.HandshakeComplete)    log.Println("client: mutual: ", state.NegotiatedProtocolIsMutual)    message := "Hello\n"    n, err := io.WriteString(conn, message)    if err != nil {        log.Fatalf("client: write: %s", err)    }    log.Printf("client: wrote %q (%d bytes)", message, n)    reply := make([]byte, 256)    n, err = conn.Read(reply)    log.Printf("client: read %q (%d bytes)", string(reply[:n]), n)    log.Print("client: exiting")}上面的代碼拋出這個錯誤: "HTTP/1.1 400 No URI\r\nContent-Type: text/html;charset=iso-8859-1\r\nContent-Length: 49\r\nConnection: close\r\nServer: Jetty(9.4.19.v20190610)\r\n\r\n<h1>Bad Message 400</h1><pre>reason: No URI</pre>" (188 bytes)我的問題是建立連接后如何將消息發送到特定的 URI?即我想向wss://localhost:443/server-demo.
查看完整描述

1 回答

?
米脂

TA貢獻1836條經驗 獲得超3個贊

問題中的代碼沒有建立到服務器的 WebSocket 連接。


要建立 WebSocket 連接,應用程序必須編寫 WebSocket 握手conn并接收握手響應。有關詳細信息,請參閱RFC。


大多數應用程序使用 websocket 包來處理所有這些細節。gorilla/websocket包是一個流行的選擇。


這段代碼應該讓你開始使用大猩猩:


cert, err := tls.LoadX509KeyPair("nifi-1.10.0-bin/nifi-1.10.0/extras/gen-certs/certs/admin.pem", "nifi-1.10.0-bin/nifi-1.10.0/extras/gen-certs/certs/admin-key.pem")

if err != nil {

    log.Fatalf("server: loadkeys: %s", err)

}

config := tls.Config{Certificates: []tls.Certificate{cert}, InsecureSkipVerify: true}

d := websocket.Dialer{

    TLSClientConfig: &config,

}

c, _, err := d.Dial("wss://localhost:443/server-demo", nil)

if err != nil {

    log.Fatal(err)

}


defer c.Close()

// Use `c` to send and receive messages


查看完整回答
反對 回復 2022-05-18
  • 1 回答
  • 0 關注
  • 132 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號