【websocket】一台机子上进行多客户端模拟两个问题.1、100个客户端均是连接上立马断开,后又连接上 2、连接上的100个客户端仅有10几个在通信
多线程模拟多个客户端;内部实现参考的websocket的案例,增加的就是内部while循环发消息,一直保持通信;减掉的是事件循环,hv::WebSocketClient无参构造
构造的100个客户端
总会open->close->open;尽管最后状态是open,但是为什么会close?
连接的100个客户端,仅有几个客户端在发送消息?
根据你的描述和贴的代码,我没有看出什么原因,不过有几个问题可以指出下: 1、WebSocketClient::open内部本身会创建线程,所以你外部没必要再创建线程了,有点多此一举; 2、对于非阻塞写,内部while循环发消息是不对的,需要做流控,控制写入速度,判断可写时再发,具体可以设置ws->onWriteComplete,以及通过ws->isWriteCompleted来判断,不做流控不断的写入,可能导致内部写缓存到达限制后,为了避免内存占用过大,自动断开链接;
第一点没有影响的话先不改他了,改了第二点写入控制,我想内部缓存应该是争对单个连接的,而不是整个机器的内存,所以写入控制的变量不是static的(static的也试过了,一样的结果);到目前为止两个问题还是存在;根据调试结果可以看到模拟的客户端越多,两个问题暴露无遗;我想也是跟内存有关,但是找不到原因,写入控制已经有了;服务器代码也贴出来了
事件循环的回调里是不能做阻塞或者耗时操作的,否则会阻塞事件循环线程的执行,我看你在上面Send函数里还做了等待响应的操作,这个是不合理的,应该在onMessage里去处理响应,而不是阻塞等待响应。
好的,目前已找出原因,onopen回调函数是异步的,client->open(url,)调用后需要加一个等待onopen回调执行完成,再继续send操作,否则就会出现我说的情况