libhv icon indicating copy to clipboard operation
libhv copied to clipboard

【websocket】一台机子上进行多客户端模拟两个问题.1、100个客户端均是连接上立马断开,后又连接上 2、连接上的100个客户端仅有10几个在通信

Open QimengW opened this issue 7 months ago • 2 comments

多线程模拟多个客户端;内部实现参考的websocket的案例,增加的就是内部while循环发消息,一直保持通信;减掉的是事件循环,hv::WebSocketClient无参构造

构造的100个客户端 Image

总会open->close->open;尽管最后状态是open,但是为什么会close? Image

连接的100个客户端,仅有几个客户端在发送消息? Image

QimengW avatar May 07 '25 01:05 QimengW

根据你的描述和贴的代码,我没有看出什么原因,不过有几个问题可以指出下: 1、WebSocketClient::open内部本身会创建线程,所以你外部没必要再创建线程了,有点多此一举; 2、对于非阻塞写,内部while循环发消息是不对的,需要做流控,控制写入速度,判断可写时再发,具体可以设置ws->onWriteComplete,以及通过ws->isWriteCompleted来判断,不做流控不断的写入,可能导致内部写缓存到达限制后,为了避免内存占用过大,自动断开链接;

ithewei avatar May 07 '25 03:05 ithewei

Image

Image

Image

Image

第一点没有影响的话先不改他了,改了第二点写入控制,我想内部缓存应该是争对单个连接的,而不是整个机器的内存,所以写入控制的变量不是static的(static的也试过了,一样的结果);到目前为止两个问题还是存在;根据调试结果可以看到模拟的客户端越多,两个问题暴露无遗;我想也是跟内存有关,但是找不到原因,写入控制已经有了;服务器代码也贴出来了

QimengW avatar May 07 '25 09:05 QimengW

事件循环的回调里是不能做阻塞或者耗时操作的,否则会阻塞事件循环线程的执行,我看你在上面Send函数里还做了等待响应的操作,这个是不合理的,应该在onMessage里去处理响应,而不是阻塞等待响应。

ithewei avatar Jun 16 '25 08:06 ithewei

好的,目前已找出原因,onopen回调函数是异步的,client->open(url,)调用后需要加一个等待onopen回调执行完成,再继续send操作,否则就会出现我说的情况

QimengW avatar Jun 19 '25 01:06 QimengW