刷新数据添加到 websocket

Flush data added to websocket

我正在编写速度测试,但在客户端上传时遇到问题。

我有以下设置,当条件为真时,它基本上继续将数据写入套接字,然后关闭套接字:

    var ws = await createWebSocket(sb.serverAddress, sb.authToken);

    while (condition) {
      var bytes = generateRandomBytes(_BUFFER_SIZE_BYTES);
      ws.add(bytes);
      print('added');
      var megabits = (bytes.length * 8) / 1000000;
      channel.sink.add(megabits);
    }
    await ws.close();

我的问题是我不知道如何等待底层缓冲区接受字节。即使我将 _BUFFER_SIZE_BYTES 设置为一个巨大的大小,它仍然以断颈速度循环打印出 added,我真的想等到所有字节都被发送缓冲区接受(已经被服务器)在添加新的字节列表之前。

对于 http post 请求,您可以执行以下操作:await postReq.flush();,但我没有看到任何此类用于网络套接字的方法。

好的,所以我认为我有一个合理的解决方案。

客户端在发送更多字节之前必须等待服务器的响应:

    var bytes = generateRandomBytes(_CHUNK_SIZE_BYTES);

    ws.listen((data) async {
        ws.add(bytes);
        var megabits = (bytes.length * 8) / 1000000;
        channel.sink.add(megabits);
      }
    });

服务器 (Go) 向客户端发送一条消息,表明它可以发送一个块,然后从客户端读取整个响应,然后向客户端发出它已准备好接受另一个块的信号:

    for start := time.Now(); time.Since(start) < time.Second*maxDuration; {
        err := conn.WriteMessage(websocket.TextMessage, []byte("next"))
        if err != nil {
            break
        }

        // will get an error if try writing to closed socket
        _, bytes, err := conn.ReadMessage()
        if err != nil {
            fmt.Println(err)
            break
        }
        fmt.Println(len(bytes))
    }

认为这个解决方案是可以的。我已将块大小设置为 10Mb,这似乎工作正常。如果有人有更好的主意,请告诉我。