c#网络传输
接着前面简单讲的,给大家聊聊服务开发。
网络传输
先说网络传输开发,总体来说,可以看成4中模型

我们把传输过程看做网线,那么在通过传输的过程中。2边就涉及池化问题,也就是我们常见的异步传输。
在业务端,有N个线程将数据放到池中(矩形),然后“网线”处有M个线程将数据丢到网络上。对于2边都是。
对于最上面的那种模型,M=0,也就是我们常见的一端直接发送,一端接收。也就是一对一的同步应用,直到演化成最后一种。
最后一种,在实现上,大概就是2类,一类是事件回调通知,一类是池中数据控制量,来传递数据。
传输组件dotnetty
不想多说,网上都有,只简单提下。以TCP为例,它在干什么。N个线程负责接收连接(简单理解成收取连接的socket),M个线程来处理这些Socket,检查是否有数据,当按照注册的解析Hander,接收完成一包数据,则通过PIP传递处理。这样就简化了数据接收的过程,可以控制线程。
我们自己一般写一对一同步处理时,就是必须线程接收连接,连接以后收取数据(很多时候我们是同步收取,这样有多少连接就占用多少线程)。dotnetty这样做就能控制好线程使用情况。但是数据收取会相对于同步延迟一点点。另外就是这样实现其实就是异步事件了,好,到此打住,具体使用和遇到问题解决方法,网上有,java的netty不仅仅是个传输组件,还养活了很多书籍呢(哈哈哈哈)。有问题就去搜搜,按照java的处理方式都可以的,比较是照搬实现过程的。
最后说说使用,网上全部是给的官网例子,我就不多说了。我想说的是,作为传输,我们使用时肯定会去封装的,那么如何去使用就需要根据业务了,但是无法是2分小类,一个小类是在业务Hander里面就直接调用我们的业务处理类,另外就是在业务Hander里面通过事件回调的方式,把数据传出来,而整个业务hander仅仅是传输层的一部分。而我喜欢把传输完全隔离处理,业务hander里面通过事件回调。
当然,整个dotnetty就是上面模型中的“网线”。至于网线内部又是怎么实现,又是另外的一个说法了。
同步构造实现
既然上面的全部是异步的,有还有业务层的交互,所以在业务层上又有很多不同。以我前写的数据库查询服务化为例。
我把上面的“网线”转成了dotnetty,那要实现很好的RPC模式怎么弄?先看下图:

逐步说明下。
1.业务层将数据丢下来,也就是我们调函数,返回需要函数返回,这时中间有一个类,来构造一个请求结构,其实简单理解成保持参数,然后使用AutoResetEvent阻塞起来。这个类暂时叫Adapter。它负责产生一个ID,等待数据返回后匹配AutoResetEvent。
2.Adapter将需要传递的数据传递给客户端管理类。客户端管理类工作有好几个,第一个就是临时存储数据,也就是池数据。
管理类要找到合适的客户端,为什么说合适?这里考虑了负载均衡和多个连接。
对于服务,可以有多个部署,这里加入有N个地址,每一个服务还可以有多个连接啊,假设每个服务有M个连接,这样客户端管理类就需要从这N*M个连接中找到比较合适的一个传递数据。后面我再说我是如何处理的。
管理类还有一个工作就是验证客户端连接情况,为什么,我是假动态实现的。当我需要传递数据时,会首先初始化一个连接,当这个连接提交的数据量很大时,就开启新的一个。当所有客户端都停下来没有数据提交,则就浪费网络资源了,所以还得关闭。这里我是按照5分钟没有数据提交就关闭了连接。
另外一个问题是网络异常,dotnetty是异步回调,加上前面的功能,是没法很快知道网络是异常的,客户端不能提交还是客户端自己在关闭,所以需要客户端管理区验证网络异常,不能连接。
根据前面的内容,客户端管理类主要体现了四个功能:数据缓存,客户端选择,网络异常检查,客户端实时关闭。
接着前面,假设服务有N个,M个连接,那么就按照客户端空闲和数据提交频率来选择,首先选择空闲的,然后选择客户端提交频率最小的。
当然我实现的更加复杂,还有数据处理,从池中取数据,比如池中数据每超过1000个,就多开启一个线程去重池中抽取数据网客户端丢。还有网络异常时存储文件等功能就是有这个管理类来操作的。另外这个是单例,我们的功能可能不只一个,比如一个功能是传文件,一个是发数据消息,其实就是2类服务,所以管理类中还要分门别类往服务端提交。
3.同样在服务端也就差不多的对等功能。
不知道大家明白没有,其实上面那幅图是在流程上的,代码上的实现关系应该是下面这样的:

这就是异步传输组件要构造RPC模型的效果和过程。
例子数据库查询服务
我以前写了一个查询数据库服务化,现在重新按照上面的逻辑更新了。可以调试。
当然这里面有业务逻辑。整个服务传输加密了。简单说下,前面的博文已经介绍了。
服务端产生RSA秘钥。
客户端首先需要登录验证,一个字符串的MD5。从服务端获取RSA的公钥,同时服务端为客户端分配一个sessionid.
客户端自己参数AES加密的秘钥。用AES把传输的 byte[]加密,然后用RSA的公钥对自己的AES秘钥加密,然后构造一个协议传输,协议中还必须有前面的sessionid。服务端接到数据请求,先检查sessionid还有没有效,如果没有则返回错误信息要求从新登录一次,再次获取RSA公钥。如果有效 则服务端按照协议解析AES秘钥,然后再用秘钥解析传输的数据部分。
服务端每天清理一次sessionid,所以客户端每天都必须登录一次。
客户端每一个小时更新一次AES秘钥。
大概这个查询服务就是这样的了。
整个就给大家演示了异步编程开发,数据提交处理,异步构造RPC模式的过程,数据加密传输的过程,包括一些资源调度和处理,网络上的负载均衡(不是我们一般说的数据负载均衡,或者说这里是资源动态调优吧)。
其中NettyTransmission项目就是dotnetty的使用和封装处理。
代码在git上,再重复说下地址:
https://github.com/jinyuttt/DBAcessSrv.git
c#网络传输的更多相关文章
- ASP.NET知识总结(1.网络传输层)
1.网络传输层 1应用层(HTTP.FTP.SMTP)报文Message 2传输层(TCP.UDP)报文段Segment,为运行在不同主机上的应用程序进程间提供数据 传输服务.通过套接字(Socket ...
- atitit.二进制数据无损转字符串网络传输
atitit.二进制数据无损转字符串网络传输 1. gbk的网络传输问题,为什么gbk不能使用来传输二进制数据 1 2. base64 2 3. iso-8859-1 (推荐) 2 4. utf-8 ...
- Android网络传输中必用的两个加密算法:MD5 和 RSA (附java完成测试代码)
MD5和RSA是网络传输中最常用的两个算法,了解这两个算法原理后就能大致知道加密是怎么一回事了.但这两种算法使用环境有差异,刚好互补. 一.MD5算法 首先MD5是不可逆的,只能加密而不能解密.比如明 ...
- Android IOS WebRTC 音视频开发总结(五七)-- 网络传输上的一种QoS方案
本文主要介绍一种QoS的解决方案,文章来自博客园RTC.Blacker,欢迎关注微信公众号blacker,更多详见www.rtc.help QoS出现的背景: 而当网络发生拥塞的时候,所有的数据流都有 ...
- udp 视频包网络传输花屏
视频数据传输在传输层可以选择TCP或者UDP,TCP面向连接,传输中断,发送端是知道的.TCP传输的好处是不丢包,坏处是网络不太好的情况下会越堵越严重.UDP非面向连接,发送端只管发送数据,接收端有没 ...
- 网络传输速度bps与下载文件所需时间的换算
相信很多同志都非常关注自己家的计算机上网的宽带是多少.关心单位上网的宽带是多少! 但是很多同志都经常误解网络传输速度,以至于责备网络接入商(电信.网通.铁通等单位)欺骗用户,限制上网的速度! 本文,就 ...
- App安全之网络传输安全
移动端App安全如果按CS结构来划分的话,主要涉及客户端本身数据安全,Client到Server网络传输的安全,客户端本身安全又包括代码安全和数据存储安全.所以当我们谈论App安全问题的时候一般来说在 ...
- Android网络传输中必用的两个加密算法:MD5 和 RSA (附java完毕測试代码)
MD5和RSA是网络传输中最经常使用的两个算法,了解这两个算法原理后就能大致知道加密是怎么一回事了.但这两种算法使用环境有差异,刚好互补. 一.MD5算法 首先MD5是不可逆的,仅仅能加密而不能解密. ...
- Android网络传输中必用的两个加密算法:MD5 和 RSA
MD5和RSA是网络传输中最常用的两个算法,了解这两个算法原理后就能大致知道加密是怎么一回事了.但这两种算法使用环境有差异,刚好互补. 一.MD5算法 首先MD5是不可逆的,只能加密而不能解密.比如明 ...
- 解决TCP网络传输“粘包”问题
当前在网络传输应用中,广泛采用的是TCP/IP通信协议及其标准的socket应用开发编程接口(API).TCP/IP传输层有两个并列的协议:TCP和UDP.其中TCP(transport contro ...
随机推荐
- java多线程中的死锁、活锁、饥饿、无锁都是什么鬼?
死锁.活锁.饥饿是关于多线程是否活跃出现的运行阻塞障碍问题,如果线程出现了这三种情况,即线程不再活跃,不能再正常地执行下去了. 死锁 死锁是多线程中最差的一种情况,多个线程相互占用对方的资源的锁,而又 ...
- Angular面试题一
一.ng-show/ng-hide 与 ng-if的区别? 第一点区别是, ng-if 在后面表达式为 true 的时候才创建这个 dom 节点, ng-show 是初始时就创建了,用 display ...
- 搭建hustoj
环境:centos6.5 + LAMP环境 LAMP环境的搭建可以参考下面这篇文章 http://www.cnblogs.com/yoke/p/7257184.html 搭建完LAMP环境之后可以按照 ...
- android OrmLite
最近在使用ormlite框架进行数据库的操作,下面简单的写个demo来学习下 1.下载jar包 这里使用的是ormlite-core-5.0.jar 和 ormlite-android-5.0.jar ...
- 微信小程序一个页面多个按钮分享怎么处理
首先呢,第一步先看api文档: 组件:button https://developers.weixin.qq.com/miniprogram/dev/component/button.html 框架- ...
- 让图片左右缓慢移动的MoveView
让图片左右缓慢移动的MoveView 效果: 源码: MoveView.h 与 MoveView.m // // MoveView.h // AnimationView // // Created b ...
- Bootstrap 4/3 页面基础模板 与 兼容旧版本浏览器
Bootstrap 3 与 4 差别很大,目录文件结构.所引入的内容也不同,这里说说一下 Bootstrap 引入的文件.网页模板和兼容性问题.本网站刚刚搭建好,正好发一下文章原来测试网站. Boot ...
- Android启动外部应用的方法
1.根据package的名称获取应用的Launch Intent Intent LaunchIntent = getPackageManager().getLaunchIntentForPackage ...
- [EffectiveC++]item17:以独立语句将newed对象置入智能指针
Store newed objects in smart pointers in standalone statements
- Linux命令--网络管理
write命令 Linux write命令用于传讯息给其他使用者. 使用权限:所有使用者. 语法 write user [ttyname] 参数说明: user : 预备传讯息的使用者帐号 ttyna ...