工作中负责开发过数据传输通用模块,跟随者c++大牛们快速成长,本文分享一些心得。
1.基本的概念
建立tcp连接三次握手、断开tcp连接四次握手,这两个概念请自己google
2.错误排查工具:
1).netstat -anp |grep your's port:
此命令用于查看linux下你的端口的状态,通过它可以观察到连接是否建立、是否正常(状态是established、收发栈为空或者持续变化)、是否关闭服务器的防火墙(经常会遇到机器的防火墙没有stop,然后请求连接状态处于sys send的状态)。
2).查看端口数据流通情况的神器tcpdump
基本用法请自行google,学会几个关键点:怎么看一个包是push包还是answer包、能够简单的分析网络连接的状态、保存abc.pcap文件然后可以在windows平台上用wirshark分析字节(这点必须掌握,通常会抓包看数据传输是否正常);
3).基本步骤:
先用1)查看网络连接是否正常,如果1)排查不出来,请用2)抓包分析;并且详细审查你的代码,逻辑不错为根本。
3.程序模型:
说起网络编程,肯定离不开的另一个话题就是多线程,真实的场景下,几乎都是并行收发处理数据,所以程序的模型至关重要。好的程序模型,不仅可以从性能上大大提高处理速度,而且能缩短研发周期。
在思考模型的时候主要考虑的点是:
1).IO的类型是nio还是bio,不同的类型决定了不同的线程模型
bio对应于一个线程一个连接,那么当连接数量很多的时候(每个连接内部最好有自己的缓存内存块,也有公用的一块大内存的,但是得用读写锁去处理数据出入的问题,而且连接过多的时候,就算是读写锁也未必能达到要求,所以多花点内存是值得的),要一个消费线程管理好几个连接推送过来的数据
nio则把接收的数据拷贝先拷贝给一个分发线程,然后此分发线程将数据均衡的分配给n个消费线程,用并行化去提高处理速率
2).tcp连接的数量、每个连接的有效期、每个连接的数据量
这些是决定使用哪类IO的重要依据,如果是长连接并且数据实时性要求高、数据量大,则bio;如果连接数量特别多(500+),则选择nio。
3).学会画模型图,写好设计文档,类间的队列不应该暴露出来(持有对象引用,调用相应的方法去push/pop元素)
4).在关键的地方要替换掉锁,一种锁的替换思路请参考我的这篇bloghttp://www.cnblogs.com/uttu/archive/2013/02/07/2908685.html在几个逻辑重要点部分