刷新添加到websocket的数据



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

我有一个如下的设置,它基本上在条件为true时继续将数据写入套接字,然后关闭套接字:

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();,但我看不到任何用于web套接字的此类方法。

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

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

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,这似乎还可以。如果有人有更好的想法,请告诉我。

最新更新