Websocket 在围棋中发球

Websocket 在围棋中发球,websocket,go,Websocket,Go,我开始玩websockets+go,我想我误解了go中websockets的一些基本功能 我只想简单地侦听websocket连接并相应地进行处理。然而,我在使用websocket的Go中看到的所有示例都是为连接到websocket的网页提供服务,这是一个要求吗 以下是我已设置的基本echo服务器: package main import ( "fmt" "code.google.com/p/go.net/websocket" "net/http" ) func webHandle

我开始玩websockets+go,我想我误解了go中websockets的一些基本功能

我只想简单地侦听websocket连接并相应地进行处理。然而,我在使用websocket的Go中看到的所有示例都是为连接到websocket的网页提供服务,这是一个要求吗

以下是我已设置的基本echo服务器:

package main

import (
  "fmt"
  "code.google.com/p/go.net/websocket"
  "net/http"
)

func webHandler(ws *websocket.Conn) {
  var s string
  fmt.Fscan(ws, &s)
  fmt.Println("Received: ", s)
}

func main() {
  fmt.Println("Starting websock server: ")
  http.Handle("/echo", websocket.Handler(webHandler))
  err := http.ListenAndServe(":8080", nil)
  if err != nil {
    panic("ListenAndServe: " + err.Error())
  }
}
这是用于连接的javascript:

ws = new WebSocket("ws://localhost:8080/echo");
ws.onmessage = function(e) {
    console.log("websock: " + e.data);
};
然而,这导致:
WebSocket与“ws://localhost:8080/echo”的连接失败:意外响应代码:403

从Javascript使用WebSocket时,很少需要直接读取帧。老实说,我甚至不知道该怎么做

幸运的是,websocket包已经有了一个类型,
Codec
,可以为您实现这一点。我的建议是使用预定义的websocket.Message编解码器来代替
接收
发送
消息

Message是一种编解码器,用于在WebSocket连接上发送/接收帧中的文本/二进制数据。要发送/接收文本框,请使用字符串类型。要发送/接收二进制帧,请使用[]字节类型

使用websocket.Message,您的webHandler将如下所示:

func webHandler(ws *websocket.Conn) {
    var in []byte
    if err := websocket.Message.Receive(ws, &in); err != nil {
        return
    }
    fmt.Printf("Received: %s\n", string(in))
    websocket.Message.Send(ws, in)      
}

而且,不,Go服务于网页不是一项要求。您收到的403错误与Go或websocket软件包无关。

我也有类似的问题,403错误问题与Go如何处理:

处理程序是WebSocket浏览器客户端的简单接口。默认情况下,它检查源标题是否为有效URL。您可能需要在func中验证websocket.Conn.Config().Origin。如果使用服务器而不是处理程序,则可以调用websocket.Origin并在握手函数中检查来源。所以,若你们想接受非浏览器客户端,它不发送源文件头,你们可以使用服务器。这不会在握手时检查原点

要禁用原点检查,您必须使用以下命令:

http.HandleFunc("/echo",
    func (w http.ResponseWriter, req *http.Request) {
        s := websocket.Server{Handler: websocket.Handler(webHandler)}
        s.ServeHTTP(w, req)
    });

至少这解决了我的问题(服务器到服务器的WebSocket通信),我认为如果原始标头不匹配,它也可以解决问题。

if块中的中断意味着什么?@ElgsQianChen中断很可能是我的一个残余,首先将接收和发送放入for循环,以防止在收到第一条消息后断开连接。我把它改成了一个
return
。啊,我明白了。谢谢你的解释@ANisus。我也在寻找一种禁用交叉原产地检查的方法。src/ondemand/server.go:103:无法将func-literal(类型func(http.ResponseWriter,*http.Request))用作http.Handle的参数中的类型http.Handler。Handle:func(http.ResponseWriter,*http.Request)未实现http.Handler(缺少ServeHTTP方法),谢谢!这个解决方案不仅有效,而且完全符合我已有的解决方案!