当前位置:编程学习 > 网站相关 >>

一月学习socket tcp通信总结

学习过程
1.首先学习封包拆包,这步是必须的
2.考虑怎样实现高并发的通信,在网上浏览很多文章,这里我选用了SocketAsyncEventArgs,这个类在.net2.0sp1及以后版本
  支持,此类对异步socket收发,线程调度,信号同步等做了封装优化,底层直接调用winapi,所以  socket通信效率是跟语言无关的
3.进行封装成一个公共类库,方便以后调用

总结:
socket 的并发连接是很高的,一般几万个不成问题,当然我说的只是连接,我只拿1w个并发连接进行了
测试,再高意义也不大,因为下一步的业务处理逻辑等会对他进行限制,形成瓶颈
下面通过测试来说明问题

测试方案一
客户端并发4000个连接到服务器,每过30秒发送一条消息到服务器(内容就是一日期),服务器收到
拆包保存到mysql数据库,然后把消息再发回客户端,上图开始

 

 服务器客户端连接完毕

 

\ 

经过5轮首发消息,得到结论负载完全正常

\ 

测试2

看上面结果处理还蛮轻松的,我们继续给它加压 并发10000个连接

 \

\ 

 上面的结果大家看到了,客户端已经发送了30000条,但服务器只处理了5579条,其余的哪去了\,没有丢,其实socket收发速度是很快的

立刻处理不了的被缓存了,当缓存达到一定数量时,就要出处理方案了,这时候要么拒绝服务,大家常见的Http500 服务器忙 错误怎么来的知道了吧,

要么扩容,多台服务器分担压力

 回到正题来,我们在服务器端没什么业务逻辑呀,就只解了下包,不应该连这点并发都处理不了啊,开始排查瓶颈,用profiler工具查看,发现80%左右耗在了

写mysql数据库上, 解决方法就是把这些io干掉

1.批更新,等到1000条再batch update 到数据库里,对我我这个测试或小应用足够了

2.换到内存数据库上(目前对内存数据库我了解不多,内存数据库要防断电等,所以最终要同步到磁盘sql数据库中),内存数据作为中间缓冲层,通过同步策略到磁盘上

 

 

结束语:瓶颈找到了,问题也就解决了,以后想在此基础上写个IM

 -------------------------------------------------------------------------

我代码就不贴也,等im做出来后在放出来,下面列举下学习资源

html">http://www.zzzyk.com/kf/201105/90403.html

蛙蛙教你解析网络包

 

网络上针对具体问题的还很多,就不列了
补充:综合编程 , 其他综合 ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,