多人聊天室 服务器端OnReceive无法触发
我用CSocket写了个基于MFC的多人聊天室程序。可是当我多次点击客户端的发送按钮时,刚开始服务器端可以受到客户端发送的消息,可是当客户端发送多次后,服务器就收不到了。(经我调试发现是服务器端的OnReceive没有触发。我反复测试,有时候是客户端发5 6次,服务器就收不到;有时候是客户端发几十次后,服务器才收不到)。
我的服务器有CServerSocket类和CClientSocket类,都是派生于CSocket
客户端发送消息代码如下:
建议你在新建指针以后将对象先置0再赋值
然后再用完以后及时释放,再试试
如果还是这样的话,修改下服务器模型
个人觉得CSOCKET在大量并发情况下效率会相对差点,每个请求都要等OnReceive结束以后才能重复执行,势必会造成阻塞等情况
或者,你在OnRevive里面开个线程来做解析什么的
[解决办法]
在换句话来说,如果你真想构架一个并发量大并且可靠的服务器,CSOCKET是应该抛弃的,用IOCP或者ACE要好点。
网上类似于这种聊天室的,更多的主要目的在于实现功能,而不在于几千几万个并发的性能。
设计出发点就不同,如果你做聊天室,设计目的是几千个人同时在线的,那必定不能使用CSocket。相反,如果只是十几个人乃至于几十个人的小规模聊天室,那普通的模型就足够了。处理大并发量的数据传送有专用的模型,你一定要用Csocket来处理大并发量这种情况,就是走了弯路,或者说钻牛角尖了。不是说不能搞,就是比较麻烦,呵呵
个人观点,仅供参考
[解决办法]
还在继续,加油。。。也比较关注,网络这块也比较菜鸟,公司项目也没怎么涉及网络编程。。。
郑阿奇的《Visual C++网络编程(含CD光盘1张)》第3章 即时通信:网络聊天软件 有介绍CSocket实现的版本。。。源码 论坛下载有,可以去找找。
该聊天室程序比你的版本只多了一点内容,
思路大概是在 包头结构体header添加长度、类型(用户登录或发送聊天信息)2个成员,,,连接的时候和发送聊天信息一样,同时发送2个包,一个header包、一个“用户名”包,用户名用于区分socket,,,服务器socket(CClientSocket类)的OnReceive函数(判别是登录还是发送信息,登录则接收用户名包,否则接收的是发送聊天信息)接收这个包,就可以保存该客户端的用户名。。。47楼说的标示名就是大概类似用户名的。
郑阿奇的版本,服务器端2个socket类,CServerSocket类是监听socket类、CClientSocket类是为每个客户端分配的socket类。CServerSocket类中一个客户端new一个CClientSocket类对象,并用链表存储。
[解决办法]
HANDLE?handle=NULL;
????handle=_beginthread((void)mufun,NULL,(LPVOID)this);
????if(handle?==?NULL)
????{
????????return?;
????}
????
????CloseHandle(handle);
线程开了以后,你就CloseHandle,问题在这。这个handle你不需要管,线程结束以后会自己销毁的
线程刚开始跑你就主动关闭了