当前位置: 首页 > 知识库问答 >
问题:

WebSocket-结束握手大猩猩

丁均
2023-03-14

来自WebSocket RFC的片段:

要使用状态代码(第7.4节)/code/和可选关闭原因(第7.1.6节)/reason/启动WebSocket关闭握手,endpoint必须发送关闭控制帧,如第5.5节所述。1,其状态代码设置为/code/,关闭原因设置为/reason/。一旦endpoint发送和接收到关闭控制帧,该endpoint应按照第7.1节中的定义关闭WebSocket连接。1.

我正在尝试使用Gorilla WebSocket包进行亲密握手,代码如下:

服务器:

// Create upgrader function
conn, err := upgrader.Upgrade(w, r, nil)

// If there is an error stop everything.
if err != nil {
    fmt.Println(err)
    return
}

for {
    // Read Messages
    _, _, err := conn.ReadMessage()
    // Client is programmed to send a close frame immediately...
    // When reading close frame resend close frame with same
    // reason and code
    conn.WriteMessage(websocket.CloseMessage, websocket.FormatCloseMessage(1000, "woops"))
    fmt.Println(err)
    break
}

客户:

d := &websocket.Dialer{}

conn, _, err := d.Dial("ws://localhost:8080", nil)

if err != nil {
    fmt.Println(err)
    return
}

go func() {
    for {
        // Read Messages
        _, _, err := conn.ReadMessage()

        if c, k := err.(*websocket.CloseError); k {
            if(c.Code == 1000) {
                // Never entering since c.Code == 1005
                fmt.Println(err)
                break
            }
        }
    }
}()

conn.WriteMessage(websocket.CloseMessage, websocket.FormatCloseMessage(1000, "woops"))

for {}

服务器正在按预期读取闭合帧,并输出以下内容:

websocket:close 1000(正常):低音

然而,客户端就像它一旦发送关闭消息就停止阅读一样。ReadMessage继续返回错误1005。我做错了什么?

共有1个答案

井宪
2023-03-14

服务器用代码响应关闭帧:

    c.WriteControl(CloseMessage, []byte{}, time.Now().Add(writeWait))

这被翻译成由客户端关闭代码1005(没有接收到状态)。

客户端应用程序看不到服务器写入的1000 oops关闭帧,因为websocket连接在收到第一个关闭帧后停止从网络读取。

当ReadMessage返回错误时,客户端应用程序应退出循环。不需要检查特定的关闭代码。

for {
    // Read Messages
    _, _, err := conn.ReadMessage()
    if err != nil {
        break
    }
}

与问题中的问题无关,服务器应用程序应在发送关闭帧后关闭websocket连接。

同样与问题中的问题无关,使用select{}而不是for{}来阻止主goroutine。前者简单地阻止了goroutine。后者使用CPU时间旋转。

 类似资料:
  • 大象与猩猩 是o2o平台全套解决方案,现将Wechat h5、android、iOS三套代码正式开源。

  • 我有一个使用WinSock2的cpp服务器,我试图用我的javascript客户端连接到这个服务器,但它不起作用,chrome控制台说“WebSocket握手过程中出错:不正确的‘Sec-WebSocket-Access’标头值”。我把我的sha1和bas64函数与在线进行了比较Sha1和Base64,所以问题不在这里。 Chrome响应报头: Chrome请求头: 服务器代码: 客户代码:

  • 我正在制作一个有游戏的网站。对于游戏,我需要发送数据。加载页面时一切正常,但我无法让握手生效。 socketReq变量存在是因为我不希望任何人直接从浏览器连接到localhost:25580。我的发送和接收功能在不同的线程中,它们将在握手后启动。 JS中新WebSocket(ws://localhost:25580)的结果是 到“ws://localhost:25580/”的WebSocket连接

  • 我正在使用Python的套接字来响应Websocket请求,并且我面临着头的问题。以前可能有过类似的问题,但没有人为我工作 文档位于https://developer.mozilla.org声明对于要建立的连接: 服务器获取握手请求中发送的Sec-WebSocket-Key的值,追加258EAFA5-E914-47DA-95CA-C5AB0DC85B11,获取新值的SHA-1,然后对其进行Bas6

  • 我正在使用C Builder 10.1柏林编写一个简单的WebSocket服务器应用程序,它在端口上侦听从网络浏览器发送的一些命令,如谷歌Chrome。 在我的表单上,我有一个TMemo、TButton和TIdHTTPServer,我有以下代码: 从Chrome,我执行这个Javascript代码: 但是我从Chrome上得到了这个错误: VM77:1到“ws://localhost:55555/

  • 问题内容: 在用go编写的HTTP服务器中,我使用大猩猩/多路复用器进行路由, 我想使用(和/或其他“中间件”),但我不知道该在哪里放置它们。 明确说明: 我通过创建一个新的路由器 通过类似的电话添加我的路线 我通过和创建服务器 为此,我可以在哪里插入或任何其他中间件? 问题答案: 这是您可以执行的操作: 如果您有多个HTTP处理程序,则可以将它们堆叠起来: