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 ...
随机推荐
- 利用PIE实现全球云分布图的效果
1.问题背景: 最近项目中获得了一份全球云分布图,客户要求把云显示在全球地图上,出现云的效果,如下图所示: [全球云分布图] [世界地图云示意图] 2.解决思路 咨询专业的业务人员,建议我测试下试试地 ...
- MUI框架-04-切换页面头部文字重叠
MUI框架-04-切换页面头部文字重叠 从现在开始就只分享 MUI 框架开发时遇到的问题了 开发不懂请查看:官方文档 问题情况 切换页面 title 文字重叠,覆盖 截图: 解决办法 给 h1 标签加 ...
- 【转】pscp实现远程文件(夹)传输
原文地址:http://blog.163.com/yang_jianli/blog/static/16199000620128251383197/ pscp与linux下的scp命令相似,功能相同,在 ...
- 搭建高可用mongodb集群(二)—— 副本集
在上一篇文章<搭建高可用MongoDB集群(一)--配置MongoDB> 提到了几个问题还没有解决. 主节点挂了能否自动切换连接?目前需要手工切换. 主节点的读写压力过大如何解决? 从节点 ...
- Azure 经典模式中虚拟机证书指纹的生成和作用
用户在使用经典虚拟机时,经常会有如下疑问:门户主板页面中的 SSH/RDP 证书指纹这项信息是怎么来的?用途是什么?为什么有的时候为空?有没有对虚拟机使用有什么影响?以下我们进行一些基本的介绍: 证书 ...
- 用FileZilla Server开FTP
FileZilla(教程)是经典的开源FTP解决方案,包括FileZilla客户端和FileZilla Server.其中,FileZilla Server的功能比起商业软件FTP Serv-U毫不逊 ...
- [COGS 0407][NOIP 2009] 靶形数独
407. [NOIP2009] 靶形数独 ★★ 输入文件:sudoku.in 输出文件:sudoku.out 简单对比时间限制:5 s 内存限制:128 MB [问题描述] 小城和小华 ...
- Python2.7 - IMOOC - 1
第一章 课程介绍 python 特点:优雅.明确.简单 python适合的领域:1.Web网站和各种网络服务:2.系统工具和脚本:3.作为"胶水"语言把其他语言开发的模块包装起来方 ...
- Python正则表达式(总)
转载请标明出处: http://www.cnblogs.com/why168888/p/6445044.html 本文出自:[Edwin博客园] Python正则表达式(总) search(patte ...
- java查找字符串里与指定字符串相同的个数
public class EmployeeDemo { //方法一: public int search(String str,String strRes) {//查找字符串里与指定字符串相同的个数 ...