如果要设计一个IM,分为服务器端和客户端。在客户端操作过程中,服务器端是应该一直和客户端保持tcp联系。还是应该客户端向服务器端完成一个请求后,立即断开,如果有下一个动作,再次请求连接。怎么样最节省资源。
解决方案 »
- 关于DataGridView中每单击某一行就弹出一个信息窗的问题
- 无Excel运行库的情况下,如何将数据写入Excel文件?
- C#和3G有什么联系
- 关于distinct,group by 查询结果不一样的问题
- 请问如何获取服务器端的时间和本机的ip地址啊?
- 如何用visual stdio 2005软件开发pda的应用界面呀,请前辈们指点!!
- 关于安装布署的问题:用VS.2003的安装项目制作,要求见内,请大家给点提示!
- TEXTBOX只能输入4位数字,
- 面试题目。。。非常紧急。。。在线等。谢谢。。。。
- 急盼高手的请教!!!!!!
- 关于OracleParameter 的写法
- httprequest请求带中文的地址
必须保证程序运行的结果是正常的
IM通讯方式
在线直接通讯
直接通过网络进行点对点的通讯,即对等通讯方式
在线代理通讯
用户A与用户B的点对点通讯由于防火墙、网络速度等原因难以建立或者速度很慢,IM服务器将会主动提供消息中转服务,即用户A和用户B的即时消息全部先发送到IM服务器,再由服务器转发给对方。
离线代理通讯
扩展方式通讯
但是您这次回贴的方式,符合您的一直以来的作风。
但是,您并没有解答楼主的疑问。楼主想问的意思是在构建IM通讯程序时,是采用持续链接还是按需链接,两种方式哪一种相较而言更为合理,更为节省资源;又或者像IM的老大QQ,是采取何种方式,还是其它的方式。
这里我们希望得您和其他高手们的指导。
因为IM来说需要定时去取消息。如果保持连接的话。长期的保持一个tcp连接,遇到一些特殊情况,比如客户端ip变化,暂时中断等。会出现问题。如果每次都链接的话,服务器端需要不断的处理链接。我不清楚如何做相对较好。
接下来考虑如何判断客户端异常断线,TCP在有keep-alive的情况下,客户端异常断线后,Receive线程会报异常或者接收到0长度包,可以关闭该连接。UDP需要维持一个客户端集合,定时检查该客户端是否在固定时间间隔内发送了心跳包,如果没有则删除该客户端。
然后考虑发送的信息是否允许丢失,如果允许,就采用UDP,如果不允许,那么采用UDP的方式,再加上一大堆保证传输成功的操作,会比TCP更加复杂。
“客户端ip变化,暂时中断等”,第一个可以通过心跳包来避免路由器关闭对客户端端口的映射,第二个对于TCP和UDP来说都是一样的要进行连接挂起(TCP)或者暂时不删除该客户端(UDP)等处理。
总之UDP不是编程时比TCP更省事,UDP的优点就是速度快,数据包小,TCP的优点就是稳定,可以捕获异常。
你这种做法可以说是一种创新,用TCP来实现单向通信而不采用HTTP,另一个创新就是在使用TCP的情况下,用类似HTTP的方式来做“即时通信”。
固执不是坏事,但在没有全面了解网络编程的情况下,固执就是武断了。