如果要设计一个IM,分为服务器端和客户端。在客户端操作过程中,服务器端是应该一直和客户端保持tcp联系。还是应该客户端向服务器端完成一个请求后,立即断开,如果有下一个动作,再次请求连接。怎么样最节省资源。

解决方案 »

  1.   

    是客户端和服务器端保持一个TCP连接不断开,然后客户端通过这个链接跟服务器端通信,服务器端也通过这个链接通信。还是每次请求链接一下,完成通信立即断开。
      

  2.   

    udp通讯程序,设计应用程协议,发送方发送,接收方要能够确认收到消息,同时要处理冗余的数据包。
    必须保证程序运行的结果是正常的
    IM通讯方式
    在线直接通讯
    直接通过网络进行点对点的通讯,即对等通讯方式
    在线代理通讯
    用户A与用户B的点对点通讯由于防火墙、网络速度等原因难以建立或者速度很慢,IM服务器将会主动提供消息中转服务,即用户A和用户B的即时消息全部先发送到IM服务器,再由服务器转发给对方。
    离线代理通讯
    扩展方式通讯
      

  3.   

    首先肯定的是,您是一个高手!并且感谢您在我的帖子中给予的最大帮助。
    但是您这次回贴的方式,符合您的一直以来的作风。
    但是,您并没有解答楼主的疑问。楼主想问的意思是在构建IM通讯程序时,是采用持续链接还是按需链接,两种方式哪一种相较而言更为合理,更为节省资源;又或者像IM的老大QQ,是采取何种方式,还是其它的方式。
    这里我们希望得您和其他高手们的指导。
      

  4.   

    当然没有最。呵呵,我表述有误,我是想问下,如何相对来说节省资源。
    因为IM来说需要定时去取消息。如果保持连接的话。长期的保持一个tcp连接,遇到一些特殊情况,比如客户端ip变化,暂时中断等。会出现问题。如果每次都链接的话,服务器端需要不断的处理链接。我不清楚如何做相对较好。
      

  5.   

    不论UDP还是TCP都需要发送心跳包,防止客户端路由器关闭对客户端端口的映射。
    接下来考虑如何判断客户端异常断线,TCP在有keep-alive的情况下,客户端异常断线后,Receive线程会报异常或者接收到0长度包,可以关闭该连接。UDP需要维持一个客户端集合,定时检查该客户端是否在固定时间间隔内发送了心跳包,如果没有则删除该客户端。
    然后考虑发送的信息是否允许丢失,如果允许,就采用UDP,如果不允许,那么采用UDP的方式,再加上一大堆保证传输成功的操作,会比TCP更加复杂。
    “客户端ip变化,暂时中断等”,第一个可以通过心跳包来避免路由器关闭对客户端端口的映射,第二个对于TCP和UDP来说都是一样的要进行连接挂起(TCP)或者暂时不删除该客户端(UDP)等处理。
    总之UDP不是编程时比TCP更省事,UDP的优点就是速度快,数据包小,TCP的优点就是稳定,可以捕获异常。
      

  6.   

    你知道不用连接也可以收发消息吗?在“保持一直连接好?还是请求一次连接一次好?”,“客户端ip变化,暂时中断等”这种问题出现前,你应该系统了解TCP、UDP、Socket套接字。
      

  7.   

    很抱歉,我知道有无连接也可以收发信息。我只是在探讨什么方式最节省资源,当然我指的是TCP,没有指UDP
      

  8.   

    个人最后决定,如果采用TCP来做IM的话,还是使用需要链接,则链接一次,然后断开,个人认为这样更加类似http。呵呵
      

  9.   

    我很好奇你的客户端发送一次消息就断开连接,服务端如何通知客户端新的消息。
    你这种做法可以说是一种创新,用TCP来实现单向通信而不采用HTTP,另一个创新就是在使用TCP的情况下,用类似HTTP的方式来做“即时通信”。
    固执不是坏事,但在没有全面了解网络编程的情况下,固执就是武断了。
      

  10.   

    那么请问http是不是基于tcp的?服务器不能在断开前给客户端信息吗?那么http协议是如何实现服务器通知客户端的呢?如果一直保持连接的话,个人认为会出现很多问题。