我写了一个简单的聊天室程序,由于没有借鉴别人的程序,完全是自己的思路,所以想请教一下,是用TCP连接的。server端:
点击监听按钮-》创建一个线程A专门accept用户。
线程A里,accpet到一个用户后就加入用户列表-》然后再创建一个线程B用于接受该用户发来的消息。
线程B里,如果接受到一个消息-》再创建一个线程D用于将消息发到所有用户。点击发送按钮-》创建线程D将消息发到所有用户。client端:
点击连接按钮-》创建一个线程A用来连接服务端,然后接受服务端的信息。
点击发送按钮-》创建一个线程B用来发送消息给服务端。我是不断的创建线程来避免堵塞,但我后来看到别人的一些思路,用的是select异步通讯,然后只要处理收到的消息就可以了,我问一下,我的思路是否正确?效率是否高?因为会创建很多线程的(客户连了n个,就要创建至少n个线程),所以有些怀疑我的程序的效率。
点击监听按钮-》创建一个线程A专门accept用户。
线程A里,accpet到一个用户后就加入用户列表-》然后再创建一个线程B用于接受该用户发来的消息。
线程B里,如果接受到一个消息-》再创建一个线程D用于将消息发到所有用户。点击发送按钮-》创建线程D将消息发到所有用户。client端:
点击连接按钮-》创建一个线程A用来连接服务端,然后接受服务端的信息。
点击发送按钮-》创建一个线程B用来发送消息给服务端。我是不断的创建线程来避免堵塞,但我后来看到别人的一些思路,用的是select异步通讯,然后只要处理收到的消息就可以了,我问一下,我的思路是否正确?效率是否高?因为会创建很多线程的(客户连了n个,就要创建至少n个线程),所以有些怀疑我的程序的效率。
解决方案 »
- 菜鸟求教vc++详细解析~~越详细越好、急求,跪谢~~
- 在Windows下如何定义服务进程与普通进程共用的安全描述字?
- HRESULT返回值为1怎么回事
- 简单问题,如何把一个已经存在的CString型的字符串变量转化为LPCOLESTR型的?
- 资源与对话框类的关系问题
- 昨天突发奇想的一个邮件收发问题
- 麻烦谁能告诉我下面这段代码含义
- 我最近看到过很多的帖子,都说自己已经学完了C++,准备学习VC+,什么样才算是学完C++呢????????
- 请edyang,vcmfc,iamafraid,horris,EGE等大虾(呵呵,排名不分先后)来看看 QueryInterface的问题
- 面对大量客户请求,c\s中服务端有何处理好大量的通信量(非专业人士莫入)
- 如何用代码改变主框架上菜单的文本(Caption)
- 请教如何加密硬盘上某一目录下的所有资源?
1. CAsyncSocket一个,用于LISTEN
2. 为每一个CLIENT分配一个 CAsyncSocket
3. 在CAsyncSocket::OnAccept的时候, 马上侦听CLIENT传来的用户信息
4. 当CLIENT有消息过来时, 根据消息定义的参数, 来确定这个消息要发送给哪些其它的CLIENTCLIENT
1. CAsyncSocket只一个, 用于发送用户信息和消息
线程B里,如果接受到一个消息-》再创建一个线程D用于将消息发到所有用户。(线程D有点问题)这个地方, 你创建一个线程的目的是为了避免堵塞, 可是你的客户端只有两个线程,因此一个线程配一个SOCKET, 因此你客户端的B线程应该是用来发送和接收消息的。而服务器端的B线程也应该是用来发送和接收消息的。如果你非要使用线程D,那么客户端也应该再创建一个线程用来接收消息用,服务器的D线程才有作用。而且这个连接还应该是由客户端发起连接的。
我不喜欢用MFC类库写核心的东西,异步的话用select,但他的机制我不是很了解。to AIDI3(艾迪)
Client的线程A就是用来接受由Server端的D线程发出的信息。简而言之:
Server端:
线程A:用于Accept数据
线程B:用于接受client来的数据
线程D:用于发送数据给clientClient端:
线程A:用于接受server端的数据
线程B:用于将数据发给server
暂时而言我觉得就是所有客户端之间的信息都要通过服务端转发可能会导致严重的延迟。还有异步和我的多线程方法,不知道那个效率更高?(主要是比较server端,client最多2条线程,没什么差别)
线程D:中,你肯定需要
for (int i=0; i<客户端总数; i++)
{
发送给客户端[i]; // 阻塞,
}如果在在第一个就阻塞了,怎么办》?