接着前面简单讲的,给大家聊聊服务开发。

网络传输

先说网络传输开发,总体来说,可以看成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#网络传输的更多相关文章

  1. ASP.NET知识总结(1.网络传输层)

    1.网络传输层 1应用层(HTTP.FTP.SMTP)报文Message 2传输层(TCP.UDP)报文段Segment,为运行在不同主机上的应用程序进程间提供数据 传输服务.通过套接字(Socket ...

  2. atitit.二进制数据无损转字符串网络传输

    atitit.二进制数据无损转字符串网络传输 1. gbk的网络传输问题,为什么gbk不能使用来传输二进制数据 1 2. base64 2 3. iso-8859-1  (推荐) 2 4. utf-8 ...

  3. Android网络传输中必用的两个加密算法:MD5 和 RSA (附java完成测试代码)

    MD5和RSA是网络传输中最常用的两个算法,了解这两个算法原理后就能大致知道加密是怎么一回事了.但这两种算法使用环境有差异,刚好互补. 一.MD5算法 首先MD5是不可逆的,只能加密而不能解密.比如明 ...

  4. Android IOS WebRTC 音视频开发总结(五七)-- 网络传输上的一种QoS方案

    本文主要介绍一种QoS的解决方案,文章来自博客园RTC.Blacker,欢迎关注微信公众号blacker,更多详见www.rtc.help QoS出现的背景: 而当网络发生拥塞的时候,所有的数据流都有 ...

  5. udp 视频包网络传输花屏

    视频数据传输在传输层可以选择TCP或者UDP,TCP面向连接,传输中断,发送端是知道的.TCP传输的好处是不丢包,坏处是网络不太好的情况下会越堵越严重.UDP非面向连接,发送端只管发送数据,接收端有没 ...

  6. 网络传输速度bps与下载文件所需时间的换算

    相信很多同志都非常关注自己家的计算机上网的宽带是多少.关心单位上网的宽带是多少! 但是很多同志都经常误解网络传输速度,以至于责备网络接入商(电信.网通.铁通等单位)欺骗用户,限制上网的速度! 本文,就 ...

  7. App安全之网络传输安全

    移动端App安全如果按CS结构来划分的话,主要涉及客户端本身数据安全,Client到Server网络传输的安全,客户端本身安全又包括代码安全和数据存储安全.所以当我们谈论App安全问题的时候一般来说在 ...

  8. Android网络传输中必用的两个加密算法:MD5 和 RSA (附java完毕測试代码)

    MD5和RSA是网络传输中最经常使用的两个算法,了解这两个算法原理后就能大致知道加密是怎么一回事了.但这两种算法使用环境有差异,刚好互补. 一.MD5算法 首先MD5是不可逆的,仅仅能加密而不能解密. ...

  9. Android网络传输中必用的两个加密算法:MD5 和 RSA

    MD5和RSA是网络传输中最常用的两个算法,了解这两个算法原理后就能大致知道加密是怎么一回事了.但这两种算法使用环境有差异,刚好互补. 一.MD5算法 首先MD5是不可逆的,只能加密而不能解密.比如明 ...

  10. 解决TCP网络传输“粘包”问题

    当前在网络传输应用中,广泛采用的是TCP/IP通信协议及其标准的socket应用开发编程接口(API).TCP/IP传输层有两个并列的协议:TCP和UDP.其中TCP(transport contro ...

随机推荐

  1. Node.js学习(篇章一)

    <node.js的特点> 采用了异步式I/O与事件驱动的架构设计,架构为单线程模型. <supervisor包的作用> node.js开发项目,当修改项目时,需要终止进程重启N ...

  2. Spring Data MongoDB 模糊查询

    Pattern pattern = Pattern.compile("^.*" + value + ".*$"); Query query = new Quer ...

  3. C++多线程编程(★入门经典实例★)

    原文:http://www.cnblogs.com/codingmengmeng/p/5913068.html 多线程在编程中有相当重要的地位,我们在实际开发时或者找工作面试时总能遇到多线程的问题,对 ...

  4. 对WebSocket技术的学习与探索(一)

    WebSocket 简要介绍 WebSocket protocol 是HTML5一种新的协议. 它实现了浏览器与服务器全双工通信(full-duple). 一开始的握手需要借助HTTP请求完成. We ...

  5. Vue小案例(一)

    案例需求: 创建一个品牌展示表格,表头有编号(id),品牌名称(name),创建时间(time)和操作,需要实现的功能是对数据的增删操作,和时间的格式化. 思路分析:在开发之前需要想清楚要用到Vue中 ...

  6. (Stanford CS224d) Deep Learning and NLP课程笔记(三):GloVe与模型的评估

    本节课继续讲授word2vec模型的算法细节,并介绍了一种新的基于共现矩阵的词向量模型--GloVe模型.最后,本节课重点介绍了word2vec模型评估的两种方式. Skip-gram模型 上节课,我 ...

  7. linux_day3

    1.grep与find的区别? grep是查找文件内的字符而find则是查找文件 2.显示/etc/passwd中以nologin结尾的行 3. 输入ip addr命令后,过滤出包含ip的行 ip a ...

  8. /etc/vsftpd.conf详解

    #################匿名权限控制############### anonymous_enable=YES  #是否启用匿名用户no_anon_password=YES #匿名用户logi ...

  9. JavaScript 使用HTML DOM的oninput事件,实时监听value值变化

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  10. ESS控制台发布新功能:创建多实例规格的伸缩配置

    背景 原弹性伸缩ESS服务限定,生效的伸缩配置中只能对应一种实例规格,这样就会存在如果生效的配置中的实例规格的库存不足(高配实例规格通常更容易出现库存不足的情况)时, 用户配置好的伸缩规则以及伸缩组对 ...