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 ...
随机推荐
- JQ的几组API辨析:
1.插入: Jq的插入一共有八个API可供选择,结果相类似,下面将以例子,简单明了的介绍下用法: <select name="one" multiple="mult ...
- 004bean作用域
1.Singleton(单例) 2.Prototype(原型)---->每次注入.通过Spring应用上下文获取,都会重新创建 @Scope(ConfigurableBeanFactory ...
- JDBC中常用对象介绍
JDBC中的主要类(接口) 在JDBC中常用的类有: 1.DriverManager 2.Connection 3.Statement 4.ResultSet 1.DriverManager 其实我们 ...
- 你真的了解Fragment的生命周期吗?
Android Framwork开发人员中的传奇人物Dianne Hackborn在2010年将Fragment引入了Android,也就是在android3.0之后引入Fragment,他在提交信息 ...
- 启用代理导致 有道云笔记未知错误、网络错误和OneDrive断线
最近有道云笔记和OneDrive时不时的连接不上服务器,不知道什么原因?后来到有道官网上看了下,才发现,和IE浏览器的设置有关系: 我本地因为之前设置了代理,然后自己忘记了,代理的软件没开,导致IE上 ...
- 自动化测试基础篇--Selenium unittest生成测试报告(HTMLTestRunner)
如何生成HTMLTestRunner测试报告.接上篇文章,对于unittest框架,运行后,测试结果不便于查看,同时多个case存在的时候,可能会导致case result记录不正确的情况. 为此,引 ...
- 传递给数据库 'model' 中的日志扫描操作的日志扫描号无效
状况描述:在服务器的管理中重新启动MSSQLSERVER启动后马上又停止 通过"事件查看器" 发现 错误: ,严重度: ,状态: LSN(::)无效.该 LSN 是传递给数据库 ...
- Django路由系统---django重点之url传递一个默认参数
django重点之url传递一个默认参数 可以利用这个特性,让2个URL映射一个函数,但是返回2个不同的HTML url(r'default_param1', views.def_param,), u ...
- XHTML基本知识
XHTML 是什么? XHTML 指可扩展超文本标签语言(EXtensible HyperText Markup Language). XHTML 的目标是取代 HTML. XHTML 与 HTML ...
- Echarts 嵌套饼图实现,内环点击控制外环显示
Echarts有交互事件,但是如果用其进行图形变更,恐怕就只有重新修改配置了. 如图,我想要实现,内圈的数据控制外圈的图形,当点击内环的某一块时,就可以实现,更改外环的目的. 起初我想能不能直接修改o ...