ブラウザから使用したいWebSocket JSON-RPCサーバーの例があります。 URL「http:localhost:8080」にアクセスすると、ブラウザはWebSocket接続を適切に開きます。しかし、ブラウザがWebSocketリクエストを送信すると、サーバーはWebSocket接続を閉じます。私は、RPCメソッドがサーバー上で呼び出されるのを見ることさえできません。go websocket jsonrpcブラウザ接続のクローズ
しかし、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)
}
ウェブ/ 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)
}
問題の原因を知っていますか?
ありがとうございました。
乾杯
この質問はhttps://groups.google.com/forum/#!topic/gorilla-web/CqBIuUCd0zAとhttps://groups.google.com/forum/#!topic/golang-nutsでも確認できました/ 4IKhYSuly9o –