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

使用Golang的gorilla/websocket包的Websocket连接下降

莘光华
2023-03-14

我正在尝试将一个NodeJS脚本移植到第三方服务器,该脚本建立并维护一个Web套接字连接,以使用大猩猩/web套接字包进行Go。在Node脚本中,ping之后会收到一个pong,并且连接会无限期保持活动状态。在Go脚本中,ping/pong可以工作,但大约30秒后服务器会断开连接。

我怀疑使用Go websocket包发送的pings是错误的,但我不能确定这是什么原因。比较运行这些程序时捕获的加密网络流量,显示TCP请求和响应的响应长度没有差异,因此这可能不是问题。任何帮助都将不胜感激!

网络套.js

#!/usr/bin/env node

// npm install websocket@1.0.25 --save
const WebSocketClient = require('websocket').client;
const client = new WebSocketClient();

let lastPing = new Date().getTime();

client.on('connectFailed', function(error) {
    console.log('Connect Error: ' + error.toString());
});

client.on('connect', function(connection) {
    console.log('Connected to Server...');
    connection.on('error', function(error) {
        console.log("Connection Error: " + error.toString());
    });
    connection.on('close', function() {
        console.log('Connection Closed');
    });
    connection.on('message', function(message) {
      if (message.type === 'utf8') {
        console.log(message.utf8Data);
      }
    });
    connection.on('pong', function(){
      console.log('[pingpong] response took', (new Date().getTime() - lastPing) + 'ms');
    })

    function send(message) {
      if (connection.connected) {
          connection.sendUTF(message);
      }
    }

    // Send a ping every 10s
    // to keep the connection live
    setInterval(function(){
      lastPing = new Date().getTime();
      connection.ping();
    }, 10000);
});

client.connect('wss://ws.radarrelay.com/0x/v0/ws');

websocket.go

package main

import (
    "flag"
    "log"
    "os"
    "os/signal"
    "time"

    "github.com/gorilla/websocket"
)

var addr = "wss://api.radarrelay.com/0x/v0/ws"

func main() {
    flag.Parse()
    log.SetFlags(0)

    timeoutDuration := 2 * time.Minute

    interrupt := make(chan os.Signal, 1)
    signal.Notify(interrupt, os.Interrupt)

    c, _, err := websocket.DefaultDialer.Dial(addr, nil)
    if err != nil {
        log.Fatal("dial:", err)
    } else {
        log.Println("Connected to server")
    }

    c.SetPongHandler(func(str string) error {
        log.Println("pong received", str)
        return nil
    })

    defer c.Close()

    done := make(chan struct{})

    go func() {
        defer c.Close()
        defer close(done)
        for {
            c.SetReadDeadline(time.Now().Add(timeoutDuration))
            _, message, err := c.ReadMessage()
            if err != nil {
                log.Println("read:", err)
                return
            }
            if len(message) >= 2 {
                message = message[2:]
            }
            log.Printf("recv: %s", message)
        }
    }()

    ticker := time.NewTicker(10 * time.Second)
    defer ticker.Stop()

    for {
        select {
        case _ = <-ticker.C:
            err := c.WriteMessage(websocket.PingMessage, []byte{})
            if err != nil {
                log.Println("write:", err)
                return
            } else {
                log.Println("ping sent")
            }
        case <-interrupt:
            log.Println("interrupt")
            // To cleanly close a connection, a client should send a close
            // frame and wait for the server to close the connection.
            err := c.WriteMessage(
                websocket.CloseMessage,
                websocket.FormatCloseMessage(websocket.CloseNormalClosure, ""))
            if err != nil {
                log.Println("write close:", err)
                return
            }
            select {
            case <-done:
            case <-time.After(time.Second):
            }
            c.Close()
            return
        }
    }
}

共有1个答案

费凯康
2023-03-14

两者之间的addr不同。节点代码正在与

wss://ws.radarrelay.com/0x/v0/ws

go代码正在与:

wss://api.radarrelay.com/0x/v0/ws

看起来这些解析到不同的IP,所以也许他们有不同的入口基础设施,并且在api子域上有超时,而在ws子域上不存在。

 类似资料:
  • 使用 jar 包 , 连接 websocket, 用域名的方式连接失败, 中间有通过 nginx 转发 用浏览器的控制台 new Websocket(wss://域名) 已经成功 nginx 配置正常的 , 用于 websocket 的配置添加了 使用 ws://域名 方式报 400 错误 用 wss://域名 方式 nginx 连请求都没收到 域名是买的, 是能通过验证的 使用 http 直接连

  • 问题内容: 我将Go(Golang)1.4.2和Gorilla WebSockets一起使用在nginx 1.4.6反向代理后面。打开页面大约一分钟后,我的WebSocket断开连接。在Chrome和Firefox上会发生相同的行为。 最初,我在使用WebSockets连接服务器和客户端时遇到问题。然后,我读到我需要调整我的nginx配置。这就是我所拥有的。 我的Go代码基本上是在回显客户的消息。

  • 问题内容: 我正在尝试测试安全的网络套接字,但是遇到了麻烦。这是我的测试: 创建后,这是“ ws”的日志: 我没有从打开回来的日志。我正在本地运行该项目,并且当我使用Chrome Advanced Rest Client工具时,可以正常连接。 我想念什么吗?请帮忙。 编辑: 我添加并注销, 我也尝试遵循此代码,但得到相同的错误。 问题答案: 该模块正在拒绝您的自签名证书(正如人们希望的那样)。您可

  • 关闭连接标志着服务器和客户端之间的通信结束。使用事件可以关闭连接,标记通信结束后,服务器和客户端之间无法进一步传输消息。由于连接不良,也可能发生事件。 方法代表再见握手。它终止连接,除非连接再次打开,否则不能交换任何数据。 与前面的示例类似,当用户单击第二个按钮时,调用方法。 也可以传递前面提到的代码和原因说明参数,如下所示。 以下代码完整概述了如何关闭或断开Web Socket连接 - 在浏览器

  • 当在客户端和服务器之间建立了连接之后,就会从Web Socket实例触发事件。它是客户端和服务器之间的初始握手。 建立连接之后引发的事件称为。创建Web Socket连接非常简单。所要做的就是调用WebSocket构造函数并传入服务器的URL。 以下代码用于创建Web Socket连接 - 建立连接后,将在Web Socket实例上触发事件。 是指客户端和服务器之间的初始握手,它会产生第一次交换,