没做过,以我的有限认识来回答一下楼主的问题1、心跳包是最好的检测客户端是否在线的方法,也是唯一的方法。(拔网线、停电 服务端无法收到通知)
2、客户端应该没必要做多线程。
3、发送文件一般通过p2p,或者上传服务器时应该是用ftp,都是另起线程来做,跟发送聊天数据应该是不同的模块。
4、服务端要用IOCP模型,当然是多线程的。
5、每个客户端连到服务器后他的socket对象就是唯一的,而服务器应该将此socket跟他的唯一标识id绑定。

解决方案 »

  1.   

    将客户端的和服务器建立的socket与id绑定后,假如客户端的数量非常大,这个查找是不是很耗时?
      

  2.   

    你能有多大的连接量
    用map应该足够了
      

  3.   

    我之前研究过聊天系统,我来讲下自己的思想
    1.服务器端可以维护一张用户状态列表(客户名,ID,IP,状态,等等),每个用户登录,暂离,聊天,登出和断线都在该表中能够显示出来,各种客户端只要连上服务器,服务器就为该客户注册一个ID,然后改变其状态。
    聊天系统很关键的就是客户端的状态问题,通过客户端之间的心跳包感觉效率低下
    2.客户端发送数据不需要线程,简单点发送即可
    3.transmitfile这个函数知道不知道,可以百度下,用这个函数就不用考虑文件和聊天消息的切换了
    4.用IOCP,网上例子很多,随便搜搜
    5.和第一个问题差不多,只要在列表中搜索一下就行了至于聊天内容,客户端可以与客户端直接通信,服务器只负责列表,这样就减少了服务器的压力。当然也可以客户端通过服务端转发,这样的话,服务端功能会更多一点
    小小见解,有问题的话可留言讨论
      

  4.   

    通过MAP的便利搜索很快的,可以说非常快,所以说服务器列表的效率不需要考虑
      

  5.   

    我做过1W+客户连接量的系统,MAP绰绰有余,压力测试可以到8W个同时在线
      

  6.   

    在利用IOCP的时候,客户端用send发送了一个字符串"SSS",服务器在收到数据的时候,再把数据转发给客户端。在GetQueuedCompletionStatus的时候,返回的 lpnumberofbytes的值为1300,服务器在利用WSASend向客户端发送数据的时候为什么客户端收到6次FD_READ网络事件(客户端的接收用的select),用MessageBox弹出收到的数据,前5次收到的数据为空,最后一个收到的才是真实的数据,前5次是什么情况?1个WSASend可能进行多次发送操作,是不是客户端不应该用select的方式?求高手指点~
      

  7.   

    不用select方式的话,只弹出接收的实际数据。如果客户端采用select,在FD_READ中还要排除收到空的数据吗?
      

  8.   

    客户端接收的话用异步接收就可以了,可以用WSAAsynSelect
    具体看下这个
    http://topic.csdn.net/u/20110220/12/144b6d5a-f541-43ac-984a-b3d471fc57ca.html
      

  9.   

    怎么用WSASend一次发送数据的时候,发送的数据很小(“SSS”字符串),客户端收的了6次FD_READ事件?
      

  10.   

    我想请教个问题,我现在写了个聊天程序,使用udpSocket发送,目前只能在局域网中互相通信(用内网IP通信),我现在想跟外网通信,应该怎么做啊?步骤是什么? 
    我跟我朋友测试了,他能发送消息给我,因为我的电脑做了端口映射,他发消息到我的路由器IP上我就能收到,但是我不能发送消息给他,我这边获取到对方的IP地址是对方的路由器IP,发送消息则发送到对方的路由器IP上,对方电脑收不到,请问有什么办法在对方不做端口映射的前提下发送消息到对方电脑(类似QQ)?
      

  11.   

    http://topic.csdn.net/u/20120716/16/24968eb9-f466-444d-9435-6f165b8d6058.html
      

  12.   

    http://topic.csdn.net/u/20120716/16/24968eb9-f466-444d-9435-6f165b8d6058.html
      

  13.   

    http://blog.csdn.net/andy511823558/article/details/7755377
      

  14.   


    文件有个函数可以解决,TransmitFile()
      

  15.   

    这俩天忙,没来得及及时结贴,sorry。
      

  16.   

    我这两天研究了一下NAT穿越和P2P打洞的技术,可以解决两个在不同路由器下的内网主机间的相互通信,但是必须要有一个公网的服务器作为中间连接者,现在又遇到个新问题,我们单位的服务器只开放了HTTP端口,我的程序是用UDP作用通信的,请问有什么办法可以解决这个问题?