IT学习站-137zw.com

作者: 银鲜目江探
查看: 121|回复: 0

more +资源更新Forums

more +随机图赏Gallery

价值348元 RabbitMQ消息中间件技术精讲2018视频教程 百度云价值348元 RabbitMQ消息中间件技术精讲2018视频教程 百度云
微专业 - Java高级开发工程师(完整版)微专业 - Java高级开发工程师(完整版)
画画教程 SAI零基础合集(11套)202G  完整版课程分享画画教程 SAI零基础合集(11套)202G 完整版课程分享
喜马拉雅付费专辑 华语辩论冠军的思辩表达课 分享下载喜马拉雅付费专辑 华语辩论冠军的思辩表达课 分享下载
价值1169元 建设项目目标成本编制与投资收益测算 课程价值1169元 建设项目目标成本编制与投资收益测算 课程
医学生必备图谱及教材 蓝色生死恋全集奈特图谱十二本+黄...医学生必备图谱及教材 蓝色生死恋全集奈特图谱十二本+黄...

Reactor模式

Reactor模式

[复制链接]
银鲜目江探 | 显示全部楼层 发表于: 2019-11-14 10:25:04
银鲜目江探 发表于: 2019-11-14 10:25:04 | 显示全部楼层 |阅读模式
查看: 121|回复: 0

你还没有注册,无法下载本站所有资源,请立即注册!

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
什么是Reactor模式

Reactor模式是一种设计模式,它是基于事件驱动的,可以并发的处理多个服务请求,当请求抵达后,依据多路复用策略,同步的派发这些请求至相关的请求处理程序。
Reactor模式角色构成

在早先的论文An Object Behavioral Pattern for
Demultiplexing and Dispatching Handles for Synchronous Events
中Reactor模式主要有五大角色组成,分别如下:
Handle:操作系统提供的一种资源,用于表示一个个的事件,在网络编程中可以是一个连接事件,一个读取事件,一个写入事件,Handle是事件产生的发源地
Synchronous Event Demultiplexer:本质上是一个系统调用,用于等待事件的发生,调用方在调用它的时候会被阻塞,一直阻塞到同步事件分离器上有事件产生为止
Initiation Dispatcher:定义了一些用于控制事件的调度方式的规范,提供对事件管理。它本身是整个事件处理器的核心所在,Initiation Dispatcher会通过Synchronous Event Demultiplexer来等待事件的发生。一旦事件发生,Initiation Dispatcher首先会分离出每一个事件,然后调用事件处理器,最后调用相关的回调方法来处理这些事件
Event Handler:定义事件处理方法以供InitiationDispatcher回调使用
Concrete Event Handler:是事件处理器的实现。它本身实现了事件处理器所提供的各种回调方法,从而实现了特定于业务的逻辑。它本质上就是我们所编写的一个个的处理器实现。
Reactor模式  技术博客

Reactor模式实现流程


  • 初始化 Initiation Dispatcher,然后将若干个Concrete Event Handler注册到 Initiation Dispatcher中,应用会标识出该事件处理器希望Initiation Dispatcher在某些事件发生时向其发出通知
  • Initiation Dispatcher 会要求每个事件处理器向其传递内部的Handle,该Handle向操作系统标识了事件处理器
  • 当所有的Concrete Event Handler都注册完毕后,就会启动 Initiation Dispatcher的事件循环,使用Synchronous Event Demultiplexer同步阻塞的等待事件的发生
  • 当与某个事件源对应的Handle变为ready状态时,Synchronous Event Demultiplexer就会通知 Initiation Dispatcher
  • Initiation Dispatcher会触发事件处理器的回调方法响应这个事件
Reactor模式  技术博客

Java NIO对Reactor的实现

在Java的NIO中,对Reactor模式有无缝的支持,即使用Selector类封装了操作系统提供的Synchronous Event Demultiplexer功能。Doug Lea(Java concurrent包的作者)在Scalable IO in Java中对此有非常详细的描述。概况来说其主要流程如下:

  • 服务器端的Reactor线程对象会启动事件循环,并使用Selector来实现IO的多路复用
  • 注册Acceptor事件处理器到Reactor中,Acceptor事件处理器所关注的事件是ACCEPT事件,这样Reactor会监听客户端向服务器端发起的连接请求事件
  • 客户端向服务器端发起连接请求,Reactor监听到了该ACCEPT事件的发生并将该ACCEPT事件派发给相应的Acceptor处理器来进行处理。Acceptor处理器通过accept()方法得到与这个客户端对应的连接(SocketChannel),然后将该连接所关注的READ/WRITE事件以及对应的READ/WRITE事件处理器注册到Reactor中,这样一来Reactor就会监听该连接的READ/WRITE事件了。
  • 当Reactor监听到有读或者写事件发生时,将相关的事件派发给对应的处理器进行处理
  • 每当处理完所有就绪的感兴趣的I/O事件后,Reactor线程会再次执行select()阻塞等待新的事件就绪并将其分派给对应处理器进行处理
Doug Lea 在Scalable IO in Java中分别描述了单线程的Reactor,多线程模式的Reactor以及多Reactor线程模式。
单线程的Reactor,主要依赖Java NIO中的Channel,Buffer,Selector,SelectionKey。在单线程Reactor模式中,不仅I/O操作在该Reactor线程上,连非I/O的业务操作也在该线程上进行处理了,这可能会大大延迟I/O请求的响应
Reactor模式  技术博客

在多线程Reactor中添加了一个工作线程池,将非I/O操作从Reactor线程中移出转交给工作者线程池来执行。这样能够提高Reactor线程的I/O响应,不至于因为一些耗时的业务逻辑而延迟对后面I/O请求的处理,但是所有的I/O操作依旧由一个Reactor来完成,包括I/O的accept()、read()、write()以及connect()操作
Reactor模式  技术博客

多Reactor线程模式将“接受客户端的连接请求”和“与该客户端的通信”分在了两个Reactor线程来完成。mainReactor完成接收客户端连接请求的操作,它不负责与客户端的通信,而是将建立好的连接转交给subReactor线程来完成与客户端的通信,这样一来就不会因为read()数据量太大而导致后面的客户端连接请求得不到即时处理的情况。并且多Reactor线程模式在海量的客户端并发请求的情况下,还可以通过实现subReactor线程池来将海量的连接分发给多个subReactor线程,在多核的操作系统中这能大大提升应用的负载和吞吐量
Reactor模式  技术博客

代码示例:
Reactor模式  技术博客 1735841-20190908095726443-1326056267

<div style="height: 0; width: 0; max-height: 0; max-width: 0; overflow: hidden; font-size: 0em; padding: 0; margin: 0;" title="MDH:PHByZT4jIyMg5LuA5LmI5pivUmVhY3RvcuaooeW8jzxicj48YnI+UmVhY3RvcuaooeW8j+aYr+S4gOenjeiuvuiuoeaooeW8j++8jOWug+aYr+WfuuS6juS6i+S7tumpseWKqOeahO+8jOWPr+S7peW5tuWPkeeahOWkhOeQhuWkmuS4quacjeWKoeivt+axgu+8jOW9k+ivt+axguaKtei+vuWQju+8jOS+neaNruWkmui3r+WkjeeUqOetlueVpe+8jOWQjOatpeeahOa0vuWPkei/meS6m+ivt+axguiHs+ebuOWFs+eahOivt+axguWkhOeQhueoi+W6j+OAgjxicj48YnI+IyMjIFJlYWN0b3LmqKHlvI/op5LoibLmnoTmiJA8YnI+PGJyPuWcqOaXqeWFiOeahOiuuuaWh1tBbiBPYmplY3QgQmVoYXZpb3JhbCBQYXR0ZXJuIGZvcjxicj5EZW11bHRpcGxleGluZyBhbmQgRGlzcGF0Y2hpbmcgSGFuZGxlcyBmb3IgU3luY2hyb25vdXMgRXZlbnRzXShodHRwczovL2dpdGVlLmNvbS9tby1zZS1kZS1mZW5nL25vdGVzL3Jhdy9tYXN0ZXIvaW1hZ2VzL3JlYWN0b3Itc2llbWVucy5wZGYp5LitUmVhY3RvcuaooeW8j+S4u+imgeacieS6lOWkp+inkuiJsue7hOaIkO+8jOWIhuWIq+WmguS4i++8mjxicj48YnI+KipIYW5kbGUqKu+8muaTjeS9nOezu+e7n+aPkOS+m+eahOS4gOenjei1hOa6kO+8jOeUqOS6juihqOekuuS4gOS4quS4queahOS6i+S7tu+8jOWcqOe9kee7nOe8lueoi+S4reWPr+S7peaYr+S4gOS4qui/nuaOpeS6i+S7tu+8jOS4gOS4quivu+WPluS6i+S7tu+8jOS4gOS4quWGmeWFpeS6i+S7tu+8jEhhbmRsZeaYr+S6i+S7tuS6p+eUn+eahOWPkea6kOWcsDxicj4qKlN5bmNocm9ub3VzIEV2ZW50IERlbXVsdGlwbGV4ZXIqKu+8muacrOi0qOS4iuaYr+S4gOS4quezu+e7n+iwg+eUqO+8jOeUqOS6juetieW+heS6i+S7tueahOWPkeeUn++8jOiwg+eUqOaWueWcqOiwg+eUqOWug+eahOaXtuWAmeS8muiiq+mYu+Whnu+8jOS4gOebtOmYu+WhnuWIsOWQjOatpeS6i+S7tuWIhuemu+WZqOS4iuacieS6i+S7tuS6p+eUn+S4uuatojxicj4qKkluaXRpYXRpb24gRGlzcGF0Y2hlcioq77ya5a6a5LmJ5LqG5LiA5Lqb55So5LqO5o6n5Yi25LqL5Lu255qE6LCD5bqm5pa55byP55qE6KeE6IyD77yM5o+Q5L6b5a+55LqL5Lu2566h55CG44CC5a6D5pys6Lqr5piv5pW05Liq5LqL5Lu25aSE55CG5Zmo55qE5qC45b+D5omA5Zyo77yMSW5pdGlhdGlvbiBEaXNwYXRjaGVy5Lya6YCa6L+HU3luY2hyb25vdXMgRXZlbnQgRGVtdWx0aXBsZXhlcuadpeetieW+heS6i+S7tueahOWPkeeUn+OAguS4gOaXpuS6i+S7tuWPkeeUn++8jEluaXRpYXRpb24gRGlzcGF0Y2hlcummluWFiOS8muWIhuemu+WHuuavj+S4gOS4quS6i+S7tu+8jOeEtuWQjuiwg+eUqOS6i+S7tuWkhOeQhuWZqO+8jOacgOWQjuiwg+eUqOebuOWFs+eahOWbnuiwg+aWueazleadpeWkhOeQhui/meS6m+S6i+S7tjxicj4qKkV2ZW50IEhhbmRsZXIqKu+8muWumuS5ieS6i+S7tuWkhOeQhuaWueazleS7peS+m0luaXRpYXRpb25EaXNwYXRjaGVy5Zue6LCD5L2/55SoPGJyPioqQ29uY3JldGUgRXZlbnQgSGFuZGxlcioq77ya5piv5LqL5Lu25aSE55CG5Zmo55qE5a6e546w44CC5a6D5pys6Lqr5a6e546w5LqG5LqL5Lu25aSE55CG5Zmo5omA5o+Q5L6b55qE5ZCE56eN5Zue6LCD5pa55rOV77yM5LuO6ICM5a6e546w5LqG54m55a6a5LqO5Lia5Yqh55qE6YC76L6R44CC5a6D5pys6LSo5LiK5bCx5piv5oiR5Lus5omA57yW5YaZ55qE5LiA5Liq5Liq55qE5aSE55CG5Zmo5a6e546w44CCPGJyPjxicj4hW2ltZ10oaHR0cHM6Ly9naXRlZS5jb20vbW8tc2UtZGUtZmVuZy9ub3Rlcy9yYXcvbWFzdGVyL2ltYWdlcy8yLjEuMyUyMFJlYWN0b3IlRTYlQTglQTElRTUlQkMlOEYuUE5HKTxicj48YnI+IyMjIFJlYWN0b3LmqKHlvI/lrp7njrDmtYHnqIs8YnI+PGJyPjEuIOWIneWni+WMliBJbml0aWF0aW9uIERpc3BhdGNoZXLvvIznhLblkI7lsIboi6XlubLkuKpDb25jcmV0ZSBFdmVudCBIYW5kbGVy5rOo5YaM5YiwIEluaXRpYXRpb24gRGlzcGF0Y2hlcuS4re+8jOW6lOeUqOS8muagh+ivhuWHuuivpeS6i+S7tuWkhOeQhuWZqOW4jOacm0luaXRpYXRpb24gRGlzcGF0Y2hlcuWcqOafkOS6m+S6i+S7tuWPkeeUn+aXtuWQkeWFtuWPkeWHuumAmuefpTxicj4yLiBJbml0aWF0aW9uIERpc3BhdGNoZXIg5Lya6KaB5rGC5q+P5Liq5LqL5Lu25aSE55CG5Zmo5ZCR5YW25Lyg6YCS5YaF6YOo55qESGFuZGxl77yM6K+lSGFuZGxl5ZCR5pON5L2c57O757uf5qCH6K+G5LqG5LqL5Lu25aSE55CG5ZmoPGJyPjMuIOW9k+aJgOacieeahENvbmNyZXRlIEV2ZW50IEhhbmRsZXLpg73ms6jlhozlrozmr5XlkI7vvIzlsLHkvJrlkK/liqggSW5pdGlhdGlvbiBEaXNwYXRjaGVy55qE5LqL5Lu25b6q546v77yM5L2/55SoU3luY2hyb25vdXMgRXZlbnQgRGVtdWx0aXBsZXhlcuWQjOatpemYu+WhnueahOetieW+heS6i+S7tueahOWPkeeUnzxicj40LiDlvZPkuI7mn5DkuKrkuovku7bmupDlr7nlupTnmoRIYW5kbGXlj5jkuLpyZWFkeeeKtuaAgeaXtu+8jFN5bmNocm9ub3VzIEV2ZW50IERlbXVsdGlwbGV4ZXLlsLHkvJrpgJrnn6UgSW5pdGlhdGlvbiBEaXNwYXRjaGVyPGJyPjUuIEluaXRpYXRpb24gRGlzcGF0Y2hlcuS8muinpuWPkeS6i+S7tuWkhOeQhuWZqOeahOWbnuiwg+aWueazleWTjeW6lOi/meS4quS6i+S7tjxicj48YnI+IVtpbWddKGh0dHBzOi8vZ2l0ZWUuY29tL21vLXNlLWRlLWZlbmcvbm90ZXMvcmF3L21hc3Rlci9pbWFnZXMvMi4xLjMlMjBSZWFjdG9yJUU0JUJBJThCJUU0JUJCJUI2LlBORyk8YnI+PGJyPiMjIyBKYXZhIE5JT+WvuVJlYWN0b3LnmoTlrp7njrA8YnI+PGJyPuWcqEphdmHnmoROSU/kuK3vvIzlr7lSZWFjdG9y5qih5byP5pyJ5peg57yd55qE5pSv5oyB77yM5Y2z5L2/55SoU2VsZWN0b3LnsbvlsIHoo4Xkuobmk43kvZzns7vnu5/mj5DkvpvnmoRTeW5jaHJvbm91cyBFdmVudCBEZW11bHRpcGxleGVy5Yqf6IO944CCRG91ZyBMZWHvvIhKYXZhIGNvbmN1cnJlbnTljIXnmoTkvZzogIXvvInlnKhbU2NhbGFibGUgSU8gaW4gSmF2YV0oaHR0cHM6Ly9naXRlZS5jb20vbW8tc2UtZGUtZmVuZy9ub3Rlcy9yYXcvbWFzdGVyL2ltYWdlcy9TY2FsYWJsZSUyMElPJTIwaW4lMjBKYXZhLnBkZinkuK3lr7nmraTmnInpnZ7luLjor6bnu4bnmoTmj4/ov7DjgILmpoLlhrXmnaXor7TlhbbkuLvopoHmtYHnqIvlpoLkuIvvvJo8YnI+PGJyPjEuIOacjeWKoeWZqOerr+eahFJlYWN0b3Lnur/nqIvlr7nosaHkvJrlkK/liqjkuovku7blvqrnjq/vvIzlubbkvb/nlKhTZWxlY3RvcuadpeWunueOsElP55qE5aSa6Lev5aSN55SoPGJyPjIuIOazqOWGjEFjY2VwdG9y5LqL5Lu25aSE55CG5Zmo5YiwUmVhY3RvcuS4re+8jEFjY2VwdG9y5LqL5Lu25aSE55CG5Zmo5omA5YWz5rOo55qE5LqL5Lu25pivQUNDRVBU5LqL5Lu277yM6L+Z5qC3UmVhY3RvcuS8muebkeWQrOWuouaIt+err+WQkeacjeWKoeWZqOerr+WPkei1t+eahOi/nuaOpeivt+axguS6i+S7tjxicj4zLiDlrqLmiLfnq6/lkJHmnI3liqHlmajnq6/lj5Hotbfov57mjqXor7fmsYLvvIxSZWFjdG9y55uR5ZCs5Yiw5LqG6K+lQUNDRVBU5LqL5Lu255qE5Y+R55Sf5bm25bCG6K+lQUNDRVBU5LqL5Lu25rS+5Y+R57uZ55u45bqU55qEQWNjZXB0b3LlpITnkIblmajmnaXov5vooYzlpITnkIbjgIJBY2NlcHRvcuWkhOeQhuWZqOmAmui/h2FjY2VwdCgp5pa55rOV5b6X5Yiw5LiO6L+Z5Liq5a6i5oi356uv5a+55bqU55qE6L+e5o6lKFNvY2tldENoYW5uZWwp77yM54S25ZCO5bCG6K+l6L+e5o6l5omA5YWz5rOo55qEUkVBRC9XUklUReS6i+S7tuS7peWPiuWvueW6lOeahFJFQUQvV1JJVEXkuovku7blpITnkIblmajms6jlhozliLBSZWFjdG9y5Lit77yM6L+Z5qC35LiA5p2lUmVhY3RvcuWwseS8muebkeWQrOivpei/nuaOpeeahFJFQUQvV1JJVEXkuovku7bkuobjgII8YnI+NC4g5b2TUmVhY3RvcuebkeWQrOWIsOacieivu+aIluiAheWGmeS6i+S7tuWPkeeUn+aXtu+8jOWwhuebuOWFs+eahOS6i+S7tua0vuWPkee7meWvueW6lOeahOWkhOeQhuWZqOi/m+ihjOWkhOeQhjxicj41LiDmr4/lvZPlpITnkIblrozmiYDmnInlsLHnu6rnmoTmhJ/lhbTotqPnmoRJL0/kuovku7blkI7vvIxSZWFjdG9y57q/56iL5Lya5YaN5qyh5omn6KGMc2VsZWN0KCnpmLvloZ7nrYnlvoXmlrDnmoTkuovku7blsLHnu6rlubblsIblhbbliIbmtL7nu5nlr7nlupTlpITnkIblmajov5vooYzlpITnkIY8YnI+PGJyPkRvdWcgTGVhIOWcqFNjYWxhYmxlIElPIGluIEphdmHkuK3liIbliKvmj4/ov7DkuobljZXnur/nqIvnmoRSZWFjdG9y77yM5aSa57q/56iL5qih5byP55qEUmVhY3RvcuS7peWPiuWkmlJlYWN0b3Lnur/nqIvmqKHlvI/jgII8YnI+PGJyPuWNlee6v+eoi+eahFJlYWN0b3LvvIzkuLvopoHkvp3otZZKYXZhIE5JT+S4reeahENoYW5uZWzvvIxCdWZmZXLvvIxTZWxlY3Rvcu+8jFNlbGVjdGlvbktleeOAguWcqOWNlee6v+eoi1JlYWN0b3LmqKHlvI/kuK3vvIzkuI3ku4VJL0/mk43kvZzlnKjor6VSZWFjdG9y57q/56iL5LiK77yM6L+e6Z2eSS9P55qE5Lia5Yqh5pON5L2c5Lmf5Zyo6K+l57q/56iL5LiK6L+b6KGM5aSE55CG5LqG77yM6L+Z5Y+v6IO95Lya5aSn5aSn5bu26L+fSS9P6K+35rGC55qE5ZON5bqUPGJyPjxicj4hW2ltZ10oaHR0cHM6Ly9naXRlZS5jb20vbW8tc2UtZGUtZmVuZy9ub3Rlcy9yYXcvbWFzdGVyL2ltYWdlcy8yLjEuMyUyMCVFNSU4RCU5NSVFNyVCQSVCRiVFNyVBOCU4QlJlYWN0b3IuUE5HKTxicj48YnI+5Zyo5aSa57q/56iLUmVhY3RvcuS4rea3u+WKoOS6huS4gOS4quW3peS9nOe6v+eoi+axoO+8jOWwhumdnkkvT+aTjeS9nOS7jlJlYWN0b3Lnur/nqIvkuK3np7vlh7rovazkuqTnu5nlt6XkvZzogIXnur/nqIvmsaDmnaXmiafooYzjgILov5nmoLfog73lpJ/mj5Dpq5hSZWFjdG9y57q/56iL55qESS9P5ZON5bqU77yM5LiN6Iez5LqO5Zug5Li65LiA5Lqb6ICX5pe255qE5Lia5Yqh6YC76L6R6ICM5bu26L+f5a+55ZCO6Z2iSS9P6K+35rGC55qE5aSE55CG77yM5L2G5piv5omA5pyJ55qESS9P5pON5L2c5L6d5pen55Sx5LiA5LiqUmVhY3RvcuadpeWujOaIkO+8jOWMheaLrEkvT+eahGFjY2VwdCgp44CBcmVhZCgp44CBd3JpdGUoKeS7peWPimNvbm5lY3QoKeaTjeS9nDxicj48YnI+IVtpbWddKGh0dHBzOi8vZ2l0ZWUuY29tL21vLXNlLWRlLWZlbmcvbm90ZXMvcmF3L21hc3Rlci9pbWFnZXMvMi4xLjMlMjAlRTUlQTQlOUElRTclQkElQkYlRTclQTglOEJSZWFjdG9yLlBORyk8YnI+PGJyPuWkmlJlYWN0b3Lnur/nqIvmqKHlvI/lsIbigJzmjqXlj5flrqLmiLfnq6/nmoTov57mjqXor7fmsYLigJ3lkozigJzkuI7or6XlrqLmiLfnq6/nmoTpgJrkv6HigJ3liIblnKjkuobkuKTkuKpSZWFjdG9y57q/56iL5p2l5a6M5oiQ44CCbWFpblJlYWN0b3LlrozmiJDmjqXmlLblrqLmiLfnq6/ov57mjqXor7fmsYLnmoTmk43kvZzvvIzlroPkuI3otJ/otKPkuI7lrqLmiLfnq6/nmoTpgJrkv6HvvIzogIzmmK/lsIblu7rnq4vlpb3nmoTov57mjqXovazkuqTnu5lzdWJSZWFjdG9y57q/56iL5p2l5a6M5oiQ5LiO5a6i5oi356uv55qE6YCa5L+h77yM6L+Z5qC35LiA5p2l5bCx5LiN5Lya5Zug5Li6cmVhZCgp5pWw5o2u6YeP5aSq5aSn6ICM5a+86Ie05ZCO6Z2i55qE5a6i5oi356uv6L+e5o6l6K+35rGC5b6X5LiN5Yiw5Y2z5pe25aSE55CG55qE5oOF5Ya144CC5bm25LiU5aSaUmVhY3Rvcue6v+eoi+aooeW8j+WcqOa1t+mHj+eahOWuouaIt+err+W5tuWPkeivt+axgueahOaDheWGteS4i++8jOi/mOWPr+S7pemAmui/h+WunueOsHN1YlJlYWN0b3Lnur/nqIvmsaDmnaXlsIbmtbfph4/nmoTov57mjqXliIblj5Hnu5nlpJrkuKpzdWJSZWFjdG9y57q/56iL77yM5Zyo5aSa5qC455qE5pON5L2c57O757uf5Lit6L+Z6IO95aSn5aSn5o+Q5Y2H5bqU55So55qE6LSf6L295ZKM5ZCe5ZCQ6YePPGJyPjxicj4hW2ltZ10oaHR0cHM6Ly9naXRlZS5jb20vbW8tc2UtZGUtZmVuZy9ub3Rlcy9yYXcvbWFzdGVyL2ltYWdlcy8yLjEuMyUyMCVFNSVBNCU5QVJlYWN0b3IlRTYlQTglQTElRTUlQkMlOEYuUE5HKTxicj48YnI+5Luj56CB56S65L6L77yaPGJyPjxicj5gYGA8YnI+Ly8gTklPIHNlbGVjdG9yIOWkmui3r+WkjeeUqHJlYWN0b3Lnur/nqIvmqKHlnos8YnI+cHVibGljIGNsYXNzIE5JT1JlYWN0b3Igezxicj48YnI+ICAvLyDlpITnkIbkuJrliqHmk43kvZznmoTnur/nqIvmsaA8YnI+ICBwcml2YXRlIHN0YXRpYyBFeGVjdXRvclNlcnZpY2Ugd29ya1Bvb2wgPSBFeGVjdXRvcnMubmV3Q2FjaGVkVGhyZWFkUG9vbCgpOzxicj48YnI+ICAvLyDlsIHoo4XkuoZzZWxlY3Rvci5zZWxlY3QoKeetieS6i+S7tui9ruivoueahOS7o+eggTxicj4gIGFic3RyYWN0IGNsYXNzIFJlYWN0b3JUaHJlYWQgZXh0ZW5kcyBUaHJlYWQgezxicj48YnI+ICAgIFNlbGVjdG9yIHNlbGVjdG9yOzxicj4gICAgTGlua2VkQmxvY2tpbmdRdWV1ZSZsdDtSdW5uYWJsZSZndDsgdGFza1F1ZXVlID0gbmV3IExpbmtlZEJsb2NraW5nUXVldWUmbHQ7Jmd0OygpOzxicj48YnI+ICAgIHZvbGF0aWxlIGJvb2xlYW4gcnVubmluZyA9IGZhbHNlOzxicj48YnI+ICAgIHByaXZhdGUgUmVhY3RvclRocmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7PGJyPiAgICAgIHNlbGVjdG9yID0gU2VsZWN0b3Iub3BlbigpOzxicj4gICAgfTxicj48YnI+ICAgIC8vIFNlbGVjdG9y55uR5ZCs5Yiw5pyJ5LqL5Lu25ZCOLOiwg+eUqOi/meS4quaWueazlTxicj4gICAgcHVibGljIGFic3RyYWN0IHZvaWQgaGFuZGxlcihTZWxlY3RhYmxlQ2hhbm5lbCBjaGFubmVsKSB0aHJvd3MgRXhjZXB0aW9uOzxicj48YnI+ICAgIEBPdmVycmlkZTxicj4gICAgcHVibGljIHZvaWQgcnVuKCkgezxicj4gICAgICAvLyDova7or6JTZWxlY3RvcuS6i+S7tjxicj4gICAgICB3aGlsZSAocnVubmluZykgezxicj4gICAgICAgIHRyeSB7PGJyPiAgICAgICAgICAvLyDmiafooYzpmJ/liJfkuK3nmoTku7vliqE8YnI+ICAgICAgICAgIFJ1bm5hYmxlIHRhc2s7PGJyPiAgICAgICAgICB3aGlsZSAoKHRhc2sgPSB0YXNrUXVldWUucG9sbCgpKSAhPSBudWxsKSB7PGJyPiAgICAgICAgICAgIHRhc2sucnVuKCk7PGJyPiAgICAgICAgICB9PGJyPiAgICAgICAgICBzZWxlY3Rvci5zZWxlY3QoMTAwMCk7PGJyPiAgICAgICAgICAvLyDojrflj5bmn6Xor6Lnu5Pmnpw8YnI+ICAgICAgICAgIFNldCZsdDtTZWxlY3Rpb25LZXkmZ3Q7IHNlbGVjdGlvbktleXMgPSBzZWxlY3Rvci5zZWxlY3RlZEtleXMoKTs8YnI+ICAgICAgICAgIC8vIOmBjeWOhuafpeivoue7k+aenDxicj4gICAgICAgICAgSXRlcmF0b3ImbHQ7U2VsZWN0aW9uS2V5Jmd0OyBrZXlJdGVyYXRvciA9IHNlbGVjdGlvbktleXMuaXRlcmF0b3IoKTs8YnI+ICAgICAgICAgIHdoaWxlIChrZXlJdGVyYXRvci5oYXNOZXh0KCkpIHs8YnI+ICAgICAgICAgICAgLy8g6KKr5bCB6KOF55qE5p+l6K+i57uT5p6cPGJyPiAgICAgICAgICAgIFNlbGVjdGlvbktleSBzZWxlY3Rpb25LZXkgPSBrZXlJdGVyYXRvci5uZXh0KCk7PGJyPiAgICAgICAgICAgIGtleUl0ZXJhdG9yLnJlbW92ZSgpOzxicj4gICAgICAgICAgICBpbnQgcmVhZHlPcHMgPSBzZWxlY3Rpb25LZXkucmVhZHlPcHMoKTs8YnI+ICAgICAgICAgICAgLy8g5YWz5rOoIFJlYWQg5ZKMIEFjY2VwdOS4pOS4quS6i+S7tjxicj4gICAgICAgICAgICBpZiAoKHJlYWR5T3BzICZhbXA7IChTZWxlY3Rpb25LZXkuT1BfUkVBRCB8IFNlbGVjdGlvbktleS5PUF9BQ0NFUFQpKSAhPSAwPGJyPiAgICAgICAgICAgICAgICB8fCByZWFkeU9wcyA9PSAwKSB7PGJyPiAgICAgICAgICAgICAgdHJ5IHs8YnI+ICAgICAgICAgICAgICAgIFNlbGVjdGFibGVDaGFubmVsIGNoYW5uZWwgPSAoU2VsZWN0YWJsZUNoYW5uZWwpIHNlbGVjdGlvbktleS5hdHRhY2htZW50KCk7PGJyPiAgICAgICAgICAgICAgICBjaGFubmVsLmNvbmZpZ3VyZUJsb2NraW5nKGZhbHNlKTs8YnI+ICAgICAgICAgICAgICAgIGhhbmRsZXIoY2hhbm5lbCk7PGJyPiAgICAgICAgICAgICAgICAvLyDlpoLmnpzlhbPpl63kuoYs5bCx5Y+W5raI6L+Z5LiqS0VZ55qE6K6i6ZiFPGJyPiAgICAgICAgICAgICAgICBpZiAoIWNoYW5uZWwuaXNPcGVuKCkpIHs8YnI+ICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uS2V5LmNhbmNlbCgpOzxicj4gICAgICAgICAgICAgICAgfTxicj48YnI+ICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgezxicj4gICAgICAgICAgICAgICAgLy8g5aaC5p6c5pyJ5byC5bi4LOWwseWPlua2iOi/meS4qktFWeeahOiuoumYhTxicj4gICAgICAgICAgICAgICAgc2VsZWN0aW9uS2V5LmNhbmNlbCgpOzxicj4gICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTs8YnI+ICAgICAgICAgICAgICB9PGJyPiAgICAgICAgICAgIH08YnI+ICAgICAgICAgIH08YnI+PGJyPiAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHs8YnI+ICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7PGJyPiAgICAgICAgfTxicj4gICAgICB9PGJyPiAgICB9PGJyPjxicj4gICAgcHJpdmF0ZSBTZWxlY3Rpb25LZXkgcmVnaXN0ZXIoU2VsZWN0YWJsZUNoYW5uZWwgY2hhbm5lbCkgdGhyb3dzIEV4Y2VwdGlvbiB7PGJyPiAgICAgIC8vIOS4uuS7gOS5iHJlZ2lzdGVy6KaB5Lul5Lu75Yqh5o+Q5Lqk55qE5b2i5byP77yM6K6pcmVhY3Rvcue6v+eoi+WOu+WkhOeQhu+8nzxicj4gICAgICAvLyDlm6DkuLrnur/nqIvlnKjmiafooYxjaGFubmVs5rOo5YaM5Yiwc2VsZWN0b3LnmoTov4fnqIvkuK3vvIzkvJrlkozosIPnlKhzZWxlY3Rvci5zZWxlY3QoKeaWueazleeahOe6v+eoi+S6ieeUqOWQjOS4gOaKiumUgTxicj4gICAgICAvLyDogIxzZWxlY3QoKeaWueazleWunuWcqGV2ZW50TG9vcOS4remAmui/h3doaWxl5b6q546v6LCD55So55qE77yM5LqJ5oqi55qE5Y+v6IO95oCn5b6I6auY77yMPGJyPiAgICAgIC8vIOS4uuS6huiuqXJlZ2lzdGVy6IO95pu05b+r55qE5omn6KGM77yM5bCx5pS+5Yiw5ZCM5LiA5Liq57q/56iL5p2l5aSE55CGPGJyPiAgICAgIEZ1dHVyZVRhc2smbHQ7U2VsZWN0aW9uS2V5Jmd0OyBmdXR1cmVUYXNrID08YnI+ICAgICAgICAgIG5ldyBGdXR1cmVUYXNrJmx0OyZndDsoKCkgLSZndDsgY2hhbm5lbC5yZWdpc3RlcihzZWxlY3RvciwgMCwgY2hhbm5lbCkpOzxicj4gICAgICB0YXNrUXVldWUuYWRkKGZ1dHVyZVRhc2spOzxicj4gICAgICByZXR1cm4gZnV0dXJlVGFzay5nZXQoKTs8YnI+ICAgIH08YnI+PGJyPiAgICBwcml2YXRlIHZvaWQgZG9TdGFydCgpIHs8YnI+ICAgICAgaWYgKCFydW5uaW5nKSB7PGJyPiAgICAgICAgcnVubmluZyA9IHRydWU7PGJyPiAgICAgICAgc3RhcnQoKTs8YnI+ICAgICAgfTxicj4gICAgfTxicj4gIH08YnI+PGJyPiAgcHJpdmF0ZSBTZXJ2ZXJTb2NrZXRDaGFubmVsIHNlcnZlclNvY2tldENoYW5uZWw7PGJyPjxicj4gIC8vIDHjgIHliJvlu7rlpJrkuKrnur/nqIsgLSBhY2NlcHTlpITnkIZyZWFjdG9y57q/56iLIChhY2NlcHTnur/nqIspPGJyPiAgcHJpdmF0ZSBSZWFjdG9yVGhyZWFkW10gbWFpblJlYWN0b3JUaHJlYWRzID0gbmV3IFJlYWN0b3JUaHJlYWRbMV07PGJyPjxicj4gIC8vIDLjgIHliJvlu7rlpJrkuKrnur/nqIsgLSBpb+WkhOeQhnJlYWN0b3Lnur/nqIsgIChJL0/nur/nqIspPGJyPiAgcHJpdmF0ZSBSZWFjdG9yVGhyZWFkW10gc3ViUmVhY3RvclRocmVhZHMgPSBuZXcgUmVhY3RvclRocmVhZFs4XTs8YnI+PGJyPiAgLy8g5Yid5aeL5YyW57q/56iL57uEPGJyPiAgcHJpdmF0ZSB2b2lkIG5ld0dyb3VwKCkgdGhyb3dzIElPRXhjZXB0aW9uIHs8YnI+ICAgIC8vIOWIm+W7um1haW5SZWFjdG9y57q/56iLLCDlj6rotJ/otKPlpITnkIZzZXJ2ZXJTb2NrZXRDaGFubmVsPGJyPiAgICBmb3IgKGludCBpID0gMDsgaSAmbHQ7IG1haW5SZWFjdG9yVGhyZWFkcy5sZW5ndGg7IGkrKykgezxicj4gICAgICBtYWluUmVhY3RvclRocmVhZHNbaV0gPTxicj4gICAgICAgICAgbmV3IFJlYWN0b3JUaHJlYWQoKSB7PGJyPiAgICAgICAgICAgIEF0b21pY0ludGVnZXIgaW5jciA9IG5ldyBBdG9taWNJbnRlZ2VyKDApOzxicj48YnI+ICAgICAgICAgICAgQE92ZXJyaWRlPGJyPiAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZXIoU2VsZWN0YWJsZUNoYW5uZWwgY2hhbm5lbCkgdGhyb3dzIEV4Y2VwdGlvbiB7PGJyPiAgICAgICAgICAgICAgLy8g5Y+q5YGa6K+35rGC5YiG5Y+R77yM5LiN5YGa5YW35L2T55qE5pWw5o2u6K+75Y+WPGJyPiAgICAgICAgICAgICAgU2VydmVyU29ja2V0Q2hhbm5lbCBjaCA9IChTZXJ2ZXJTb2NrZXRDaGFubmVsKSBjaGFubmVsOzxicj4gICAgICAgICAgICAgIFNvY2tldENoYW5uZWwgc29ja2V0Q2hhbm5lbCA9IGNoLmFjY2VwdCgpOzxicj4gICAgICAgICAgICAgIHNvY2tldENoYW5uZWwuY29uZmlndXJlQmxvY2tpbmcoZmFsc2UpOzxicj4gICAgICAgICAgICAgIC8vIOaUtuWIsOi/nuaOpeW7uueri+eahOmAmuefpeS5i+WQju+8jOWIhuWPkee7mUkvT+e6v+eoi+e7p+e7reWOu+ivu+WPluaVsOaNrjxicj4gICAgICAgICAgICAgIGludCBpbmRleCA9IGluY3IuZ2V0QW5kSW5jcmVtZW50KCkgJSBzdWJSZWFjdG9yVGhyZWFkcy5sZW5ndGg7PGJyPiAgICAgICAgICAgICAgUmVhY3RvclRocmVhZCB3b3JrRXZlbnRMb29wID0gc3ViUmVhY3RvclRocmVhZHNbaW5kZXhdOzxicj4gICAgICAgICAgICAgIHdvcmtFdmVudExvb3AuZG9TdGFydCgpOzxicj4gICAgICAgICAgICAgIFNlbGVjdGlvbktleSBzZWxlY3Rpb25LZXkgPSB3b3JrRXZlbnRMb29wLnJlZ2lzdGVyKHNvY2tldENoYW5uZWwpOzxicj4gICAgICAgICAgICAgIHNlbGVjdGlvbktleS5pbnRlcmVzdE9wcyhTZWxlY3Rpb25LZXkuT1BfUkVBRCk7PGJyPiAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKDxicj4gICAgICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSArICLmlLbliLDmlrDov57mjqUgOiAiICsgc29ja2V0Q2hhbm5lbC5nZXRSZW1vdGVBZGRyZXNzKCkpOzxicj4gICAgICAgICAgICB9PGJyPiAgICAgICAgICB9Ozxicj4gICAgfTxicj48YnI+ICAgIC8vIOWIm+W7uklP57q/56iLLOi0n+i0o+WkhOeQhuWuouaIt+err+i/nuaOpeS7peWQjnNvY2tldENoYW5uZWznmoRJT+ivu+WGmTxicj4gICAgZm9yIChpbnQgaSA9IDA7IGkgJmx0OyBzdWJSZWFjdG9yVGhyZWFkcy5sZW5ndGg7IGkrKykgezxicj4gICAgICBzdWJSZWFjdG9yVGhyZWFkc1tpXSA9PGJyPiAgICAgICAgICBuZXcgUmVhY3RvclRocmVhZCgpIHs8YnI+PGJyPiAgICAgICAgICAgIEBPdmVycmlkZTxicj4gICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVyKFNlbGVjdGFibGVDaGFubmVsIGNoYW5uZWwpIHRocm93cyBFeGNlcHRpb24gezxicj4gICAgICAgICAgICAgIC8vIHdvcmvnur/nqIvlj6rotJ/otKPlpITnkIZJT+WkhOeQhu+8jOS4jeWkhOeQhmFjY2VwdOS6i+S7tjxicj4gICAgICAgICAgICAgIFNvY2tldENoYW5uZWwgY2ggPSAoU29ja2V0Q2hhbm5lbCkgY2hhbm5lbDs8YnI+ICAgICAgICAgICAgICBCeXRlQnVmZmVyIHJlcXVlc3RCdWZmZXIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKDEwMjQpOzxicj4gICAgICAgICAgICAgIHdoaWxlIChjaC5pc09wZW4oKSAmYW1wOyZhbXA7IGNoLnJlYWQocmVxdWVzdEJ1ZmZlcikgIT0gLTEpIHs8YnI+ICAgICAgICAgICAgICAgIC8vIOmVv+i/nuaOpeaDheWGteS4iyzpnIDopoHmiYvliqjliKTmlq3mlbDmja7mnInmsqHmnInor7vlj5bnu5PmnZ8gKOatpOWkhOWBmuS4gOS4queugOWNleeahOWIpOaWrTog6LaF6L+HMOWtl+iKguWwseiupOS4uuivt+axgue7k+adn+S6hik8YnI+ICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0QnVmZmVyLnBvc2l0aW9uKCkgJmd0OyAwKSBicmVhazs8YnI+ICAgICAgICAgICAgICB9PGJyPiAgICAgICAgICAgICAgaWYgKHJlcXVlc3RCdWZmZXIucG9zaXRpb24oKSA9PSAwKSByZXR1cm47IC8vIOWmguaenOayoeaVsOaNruS6hiwg5YiZ5LiN57un57ut5ZCO6Z2i55qE5aSE55CGPGJyPiAgICAgICAgICAgICAgcmVxdWVzdEJ1ZmZlci5mbGlwKCk7PGJyPiAgICAgICAgICAgICAgYnl0ZVtdIGNvbnRlbnQgPSBuZXcgYnl0ZVtyZXF1ZXN0QnVmZmVyLmxpbWl0KCldOzxicj4gICAgICAgICAgICAgIHJlcXVlc3RCdWZmZXIuZ2V0KGNvbnRlbnQpOzxicj4gICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihuZXcgU3RyaW5nKGNvbnRlbnQpKTs8YnI+ICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oPGJyPiAgICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpICsgIuaUtuWIsOaVsOaNrizmnaXoh6rvvJoiICsgY2guZ2V0UmVtb3RlQWRkcmVzcygpKTs8YnI+PGJyPiAgICAgICAgICAgICAgLy8gVE9ETyDkuJrliqHmk43kvZwg5pWw5o2u5bqT44CB5o6l5Y+jLi4uPGJyPiAgICAgICAgICAgICAgd29ya1Bvb2wuc3VibWl0KCgpIC0mZ3Q7IHt9KTs8YnI+PGJyPiAgICAgICAgICAgICAgLy8g5ZON5bqU57uT5p6cIDIwMDxicj4gICAgICAgICAgICAgIFN0cmluZyByZXNwb25zZSA9PGJyPiAgICAgICAgICAgICAgICAgICJIVFRQLzEuMSAyMDAgT0tcclxuIiArICJDb250ZW50LUxlbmd0aDogMTFcclxuXHJcbiIgKyAiSGVsbG8gV29ybGQiOzxicj4gICAgICAgICAgICAgIEJ5dGVCdWZmZXIgYnVmZmVyID0gQnl0ZUJ1ZmZlci53cmFwKHJlc3BvbnNlLmdldEJ5dGVzKCkpOzxicj4gICAgICAgICAgICAgIHdoaWxlIChidWZmZXIuaGFzUmVtYWluaW5nKCkpIHs8YnI+ICAgICAgICAgICAgICAgIGNoLndyaXRlKGJ1ZmZlcik7PGJyPiAgICAgICAgICAgICAgfTxicj4gICAgICAgICAgICB9PGJyPiAgICAgICAgICB9Ozxicj4gICAgfTxicj4gIH08YnI+PGJyPiAgLy8g5aeL5YyWY2hhbm5lbCzlubbkuJTnu5HlrprkuIDkuKpldmVudExvb3Dnur/nqIs8YnI+ICBwcml2YXRlIHZvaWQgaW5pdEFuZFJlZ2lzdGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7PGJyPiAgICAvLyAx44CBIOWIm+W7ulNlcnZlclNvY2tldENoYW5uZWw8YnI+ICAgIHNlcnZlclNvY2tldENoYW5uZWwgPSBTZXJ2ZXJTb2NrZXRDaGFubmVsLm9wZW4oKTs8YnI+ICAgIHNlcnZlclNvY2tldENoYW5uZWwuY29uZmlndXJlQmxvY2tpbmcoZmFsc2UpOzxicj4gICAgLy8gMuOAgSDlsIZzZXJ2ZXJTb2NrZXRDaGFubmVs5rOo5YaM5Yiwc2VsZWN0b3I8YnI+ICAgIGludCBpbmRleCA9IG5ldyBSYW5kb20oKS5uZXh0SW50KG1haW5SZWFjdG9yVGhyZWFkcy5sZW5ndGgpOzxicj4gICAgbWFpblJlYWN0b3JUaHJlYWRzW2luZGV4XS5kb1N0YXJ0KCk7PGJyPiAgICBTZWxlY3Rpb25LZXkgc2VsZWN0aW9uS2V5ID0gbWFpblJlYWN0b3JUaHJlYWRzW2luZGV4XS5yZWdpc3RlcihzZXJ2ZXJTb2NrZXRDaGFubmVsKTs8YnI+ICAgIHNlbGVjdGlvbktleS5pbnRlcmVzdE9wcyhTZWxlY3Rpb25LZXkuT1BfQUNDRVBUKTs8YnI+ICB9PGJyPjxicj4gIC8vIOe7keWumuerr+WPozxicj4gIHByaXZhdGUgdm9pZCBiaW5kKCkgdGhyb3dzIElPRXhjZXB0aW9uIHs8YnI+ICAgIC8vICAx44CBIOato+W8j+e7keWumuerr+WPo++8jOWvueWkluacjeWKoTxicj4gICAgc2VydmVyU29ja2V0Q2hhbm5lbC5iaW5kKG5ldyBJbmV0U29ja2V0QWRkcmVzcyg4MDgwKSk7PGJyPiAgICBTeXN0ZW0ub3V0LnByaW50bG4oIuWQr+WKqOWujOaIkO+8jOerr+WPozgwODAiKTs8YnI+ICB9PGJyPjxicj4gIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24gezxicj4gICAgTklPUmVhY3RvciBuaW9SZWFjdG9yID0gbmV3IE5JT1JlYWN0b3IoKTs8YnI+ICAgIC8vIDHjgIEg5Yib5bu6bWFpbuWSjHN1YuS4pOe7hOe6v+eoizxicj4gICAgbmlvUmVhY3Rvci5uZXdHcm91cCgpOzxicj4gICAgLy8gMuOAgSDliJvlu7pzZXJ2ZXJTb2NrZXRDaGFubmVs77yM5rOo5YaM5YiwbWFpblJlYWN0b3Lnur/nqIvkuIrnmoRzZWxlY3RvcuS4ijxicj4gICAgbmlvUmVhY3Rvci5pbml0QW5kUmVnaXN0ZXIoKTs8YnI+ICAgIC8vIDPjgIEg5Li6c2VydmVyU29ja2V0Q2hhbm5lbOe7keWumuerr+WPozxicj4gICAgbmlvUmVhY3Rvci5iaW5kKCk7PGJyPiAgfTxicj59PGJyPjxicj5gYGA8YnI+PGJyPjxicj48L3ByZT48cD48aW1nIHNyYz0iaHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTczNTg0MS8yMDE5MDkvMTczNTg0MS0yMDE5MDkwODA5NTcyNjQ0My0xMzI2MDU2MjY3LnBuZyIgYWx0PSIiIGRhdGEtbWNlLXNyYz0iaHR0cHM6Ly9pbWcyMDE4LmNuYmxvZ3MuY29tL2Jsb2cvMTczNTg0MS8yMDE5MDkvMTczNTg0MS0yMDE5MDkwODA5NTcyNjQ0My0xMzI2MDU2MjY3LnBuZyI+PC9wPjxwcmU+PGJyPjwvcHJlPg==">​
来源:http://www.137zw.com
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
137zw.com IT学习站致力于免费提供精品的java技术教程和python技术教程,CCNA书籍/资料/CCNP书籍/资料教程/CCIE书籍/资料/H3C学习/认证/一级建造师考试/微软学习/认证/包括基础教程和高级实战教程,同时也提供分享网站源码下载和互联网相关一系列的技术教程,我们想做的就是让知识分享更有价值!(IT学习站官方唯一域名地址:www.137zw.com 请谨防假冒网站!)本站所有资源全部收集于互联网或网友自行分享,分享目的仅供大家学习与参考,如无意中侵犯您的合法权益,请联系本站管理员进行删除处理!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

浙ICP备19022368号-1|Archiver|手机版|IT学习站-137zw.com

GMT+8, 2020-7-4 10:45 , Processed in 0.244339 second(s), 33 queries .

快速回复 返回顶部 返回列表