我写了一个简单的聊天室程序,由于没有借鉴别人的程序,完全是自己的思路,所以想请教一下,是用TCP连接的。server端:
点击监听按钮-》创建一个线程A专门accept用户。
线程A里,accpet到一个用户后就加入用户列表-》然后再创建一个线程B用于接受该用户发来的消息。
线程B里,如果接受到一个消息-》再创建一个线程D用于将消息发到所有用户。点击发送按钮-》创建线程D将消息发到所有用户。client端:
点击连接按钮-》创建一个线程A用来连接服务端,然后接受服务端的信息。
点击发送按钮-》创建一个线程B用来发送消息给服务端。我是不断的创建线程来避免堵塞,但我后来看到别人的一些思路,用的是select异步通讯,然后只要处理收到的消息就可以了,我问一下,我的思路是否正确?效率是否高?因为会创建很多线程的(客户连了n个,就要创建至少n个线程),所以有些怀疑我的程序的效率。

解决方案 »

  1.   

    Client只有一个socket吗,那启动2个线程没意义吧
      

  2.   

    按照楼主的意思,我想Client端用一个线程就够了。
      

  3.   

    不行的,client在接受服务端信息,处于堵塞状态,要另开一个线程
      

  4.   

    如果是我的话,我会使用CAsyncSocket, 因为它是非阻塞的,所以不需要创建那么多个线程,而且管理线程又麻烦:server端:
     1. CAsyncSocket一个,用于LISTEN
     2. 为每一个CLIENT分配一个 CAsyncSocket
     3. 在CAsyncSocket::OnAccept的时候, 马上侦听CLIENT传来的用户信息
     4. 当CLIENT有消息过来时, 根据消息定义的参数, 来确定这个消息要发送给哪些其它的CLIENTCLIENT
     1. CAsyncSocket只一个, 用于发送用户信息和消息
      

  5.   

    你的思路嘛: 如果你熟悉CAsyncSocket后,你会发现你的思路走了很多弯路..服务器端:
    线程B里,如果接受到一个消息-》再创建一个线程D用于将消息发到所有用户。(线程D有点问题)这个地方, 你创建一个线程的目的是为了避免堵塞, 可是你的客户端只有两个线程,因此一个线程配一个SOCKET, 因此你客户端的B线程应该是用来发送和接收消息的。而服务器端的B线程也应该是用来发送和接收消息的。如果你非要使用线程D,那么客户端也应该再创建一个线程用来接收消息用,服务器的D线程才有作用。而且这个连接还应该是由客户端发起连接的。
      

  6.   

    to  AIDI3(艾迪) 
    我不喜欢用MFC类库写核心的东西,异步的话用select,但他的机制我不是很了解。to  AIDI3(艾迪) 
    Client的线程A就是用来接受由Server端的D线程发出的信息。简而言之:
    Server端:
    线程A:用于Accept数据
    线程B:用于接受client来的数据
    线程D:用于发送数据给clientClient端:
    线程A:用于接受server端的数据
    线程B:用于将数据发给server
    暂时而言我觉得就是所有客户端之间的信息都要通过服务端转发可能会导致严重的延迟。还有异步和我的多线程方法,不知道那个效率更高?(主要是比较server端,client最多2条线程,没什么差别)
      

  7.   

    异步方式肯定会更高的,因为它是消息类型的,而你那种多线程的方式却是顺序型的。Server端:
    线程D:中,你肯定需要
    for (int i=0; i<客户端总数; i++)
    {
      发送给客户端[i]; // 阻塞,
    }如果在在第一个就阻塞了,怎么办》?
      

  8.   

    发送给客户端我用send(),如果超时会返回错误,不会永久堵塞
      

  9.   

    嗯,的确这样,除非为每一个用户再开一个线程send()。我再去研究一下异步