刷新数据添加到 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,这似乎工作正常。如果有人有更好的主意,请告诉我。
我正在编写速度测试,但在客户端上传时遇到问题。
我有以下设置,当条件为真时,它基本上继续将数据写入套接字,然后关闭套接字:
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,这似乎工作正常。如果有人有更好的主意,请告诉我。