簡體   English   中英

轉到websocket jsonrpc瀏覽器連接關閉

[英]Go websocket jsonrpc browser connection close

我有一個要在瀏覽器中使用的WebSocket JSON-RPC服務器示例。 當您訪問URL“ http:localhost:8080”時,瀏覽器會正確打開WebSocket連接。 但是,當瀏覽器發送WebSocket請求時,服務器將關閉WebSocket連接。 我什至看不到在服務器上調用RPC方法的痕跡。

但是,從Go客戶端調用服務器非常有效。

server.go

package main

import (
        "log"
        "net/http"
        "net/rpc"
        "net/rpc/jsonrpc"
        "github.com/gorilla/websocket"
)

type Service struct{}

func (t *Service) Echo(req *string, res *string) error {
        log.Printf("Service.Echo")
        *res = *req
        log.Printf("Service.Echo req:%s res:%s", *req, *res)
        return nil 
}

var upgrader = websocket.Upgrader{
        ReadBufferSize:  1024,
        WriteBufferSize: 1024,
}

func serveWS(w http.ResponseWriter, r *http.Request) {
        ws, err := upgrader.Upgrade(w, r, nil)
        defer ws.Close()


        if err != nil {
                log.Println(err)
                return
        }   
        jsonrpc.ServeConn(ws.UnderlyingConn())
}

func main() {
        rpc.Register(new(Service))
        http.Handle("/", http.FileServer(http.Dir("web")))
        http.HandleFunc("/ws", serveWS)
        http.ListenAndServe(":8080", nil)
}

web / index.html

<!DOCTYPE html>
<html lang="en">
<head>  
<script type="text/javascript">
    var ws = new WebSocket("ws://localhost:8080/ws");
    ws.onopen = function(ev){
        alert("open");
    }
    ws.onmessage = function(ev){
        alert("message");
    }
    ws.onclose = function(ev){
        alert("close");
    }   

    function send() {
        msg = {
                method: "Service.Echo",
                params: "hello",
                id: 0
        };
        var s = JSON.stringify(msg);
        alert(s);
        ws.send(s);
    }   
</script>
</head> 
<body>          
<button onclick='send()'>Send</button>
</body> 
</html>

client.go

package main

import (
        "log"
        "net/rpc/jsonrpc"
        "github.com/gorilla/websocket"
)

func main() {
        ws, _, err := websocket.DefaultDialer.Dial("ws://localhost:8080/ws", nil)
        if err != nil {
                log.Fatal("dial:", err)
        }
        defer ws.Close()

        client := jsonrpc.NewClient(ws.UnderlyingConn())

        req := "hello"
        var res string
        err = client.Call("Service.Echo", &req, &res)
        if err != nil {
                log.Fatal("Service.Echo error:", err)
        }
        log.Printf("Service.Echo: req:%s res:%s", req, res)
}

您知道可能是什么問題嗎?

非常感謝你。

干杯

當服務器應用程序調用jsonrpc.ServeConn(ws.UnderlyingConn()) } ,服務器正在從WebSocket協議切換到JSON-RPC協議。 瀏覽器繼續使用WebSocket協議。 關閉連接是因為對等方之一錯誤地讀取了它不期望的協議。

Go客戶端應用程序不會發生此問題,因為該應用程序還從WebSocket協議切換到JSON-RPC協議。

無法從瀏覽器應用程序訪問基礎網絡連接。

可以將net / rpc軟件包與編解碼器一起使用,以使用WebSocket協議。 另一個選擇是編寫一個適配器,將基於消息的WebSocket API轉換為net / rpc / jsonrpc服務器所需的流。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM