gpt4 book ai didi

go websocket jsonrpc 浏览器连接关闭

转载 作者:数据小太阳 更新时间:2023-10-29 03:15:29 25 4
gpt4 key购买 nike

我有一个 WebSocket JSON-RPC 服务器示例,我想在浏览器中使用它。当你访问“http:localhost:8080”这个URL时,浏览器会正常打开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>

客户端.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 协议(protocol)切换到 JSON-RPC协议(protocol)。浏览器继续使用 WebSocket协议(protocol)。连接已关闭,因为其中一个对等点错误地读取了它不期望的协议(protocol)。

Go 客户端应用程序不会出现此问题,因为此应用程序也从 WebSocket 协议(protocol)切换到 JSON-RPC 协议(protocol)。

无法从浏览器应用程序访问底层网络连接。

可以将 net/rpc 包与 Codec 一起使用编写使用 WebSocket 协议(protocol)。另一种选择是编写一个适配器,将基于消息的 WebSocket API 转换为 net/rpc/jsonrpc 服务器期望的流。

关于go websocket jsonrpc 浏览器连接关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36372650/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com