注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

还东国的博客

行之苟有恒,久久自芬芳

 
 
 

日志

 
 

C#网络编程  

2014-07-17 14:46:05|  分类: 网络服务编程技术 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

C#网络编程

本来C#网络编程写得就时间非常长了,长到可以用N年来计算,但是,越是熟悉的,越是会有意无意的遗忘掉他。要说从来没有总结过,可能是在说谎,但正式的总结确实是没有,这期间经历了陕西电力和内蒙电力几个大的项目,在其中也体会到了一些在公司里没有经历到的各种的现象,这些宝贵的东西其实真得应该认真的总结出来。

C#的网络通信不外乎有以下几种情况,公司有现在的C或者C++的代码的,封装成库然后用C#来调用。采用C#2.0的方法来写和C#3.5新提供的方法。

这里因为对C#做网络通信不是很重视,所以就不特别详细的介绍C#网络编程了,只简单的说明一下,在.NETFRAME WORK2.0中和3.0中的区别。如果以后真得非要大规模的商用,再详细的来说明也未为之晚也。

2.0中有过开发经验的人知道,在异步的操作中经常要产生IAsyncResult这个对象,而面临大数据量并发的情况下,产生如此多的此类对象,会造成程序中资源的高度紧张,最终会形成垃圾回收器无法快速的回收内存,在陕西项目中最后就出现了NEW一个很小的BUF都会出现异常的情况,当然,这个情形不全是上面的提到的原因。

那么微软的大佬们自然也是知道这种情况的,在3.5中就提出了新的解决方案,当然,在现在看来,这种解决方案也不能说多新。

2.0版本:

void ReceiveCallBack(IAsyncResult ar){}

IAsyncResult result=socket.BeginReceive(info.Buffer, 0, info.Buffer.Length, SocketFlags.None, ReceiveCallBack, info);//在这里有一个IAsyncResult对象被创建。

3.5版本:

void OnReceiveCompleted(object sender,SocketAsyncEventArgs e){}

SocketAsyncEventArgs receive=new SocketAnyncEventArgs();

receive.Completed+= OnReceiveCompleted;

receive.SetBuffer(buffer,0,buffer.Length);

socket.ReceiveAsync(receive);

大家可以清楚的看到,新的平台使用SocketAsyncEventArgs代替了IAsyncResult这个对象,前者则是可以不断的被复用的。

无论是在老的2.0还是在新的3.5平台上,都有一个致命性的问题,那就是如果保证同一SOCKET或者说同一客户端的数据在同一线程内处理,保证不丢失数据,不接错数据(比如乱帧神马的)。也就是说,这才是最最重要的。

那么如何才能做到呢?这得看你的应用的具体的环境,比如是高并发小数据量,还是低并发大数据量,还是小并发小数据量。你会问,为什么没有大并发大数据量,这个无语。单纯靠一个模型不改善硬件环境,是无法满足后面这一项的。

如果是高并发小数据量,那么就可以使用线程池,而低并发大数据量就得每个SOCKT提供一个稳定的线程,并合理的降低线程切换的代价。至于小并发小数据量,这个你只要不把程序写得巨烂,程序会自己跑得很好的。

学以致用,才是正道,王道,学习的至高境界。

  评论这张
 
阅读(397)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017