运用JavaNIO提高做事端按次的性能_第1页
运用JavaNIO提高做事端按次的性能_第2页
运用JavaNIO提高做事端按次的性能_第3页
运用JavaNIO提高做事端按次的性能_第4页
运用JavaNIO提高做事端按次的性能_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、运用java nio提高做事端按次的性能星散具体的jova socket编程,探求使用n10前进办事端步伐的坚守的问题。java nio增长了新的socketchannel > serversocketchannel等类來供给対成立高违拗的 效力端举措的赞成。socketchannel、serversocketchannel能够在非壅塞的形式下工作,它 们但凡selectable的类。在树立服务器或者两端件时,引荐应用java n10o在传统的internet编程屮,我们一样平常使用一个专门使用线程(thread)来措置一个 socket邻接,颠末运用ni0, 个可以或许很少几个sock

2、et线程便可以处理不计其数个勾当的 socket 邻接。一样平常悄况下,通过 serversocketchannel. open ()获得一个 serversocketchannel 的实 例,经由过程 socketchannel. open 笼统 serversocketchannel. accept ()失掉一个 socketchannel实例。要使serversocketchannel笼统socketchannel在卄缠闭的内容下垄断, 可以调用sorversockctchannel. conf iguroblocking (false);或者socketchannel. configu

3、reblocking (false);语句来抵达目的。一般状况下,效劳端可使用非壅塞的serversocketchannel,多么,做 事真个措沌便可以更易地同时处置惩罚多个socket线程。下面我们来看一个赏析例子,这个例子运用了 serversocketchannel socketchannel斥地 了一个非壅塞的、能处置多线程的echo效能端措施,赐教例12-14o【递次源代码】1 / = program discription =2 / 程序名称:示例 12-14 : socketchanneldemo.java3 / 程序目的:学习 java nio#socketchannel4 /

4、=565 import java.nio.bytebuffer;6 import java.nio.channels.serversocketchannel;7 import java.nio.channels.socketchannel;8 import java.nio.channels.selector;9 import java.nio.channels.selectionkey;10 import java.nio.channels.selectablechannel;1311 import .socket;12 import .serversocket;13 import .ine

5、tsocketaddress;14 i mport java.uti 1.iterator;1815 public class socketchanneldemo2016 17 public static int port.number = 23;/监听端口18 serversocketchannel serverchannel;19 serversocket serversocket;20 selector selector;21 private bytebuffer buffer = bytebuffer.allocatedirect (1024);2722 public static v

6、oid main (string args)23 throws exception24 25 socketchanneldemo server=new socketchanneldemo();26 scrvcr.init(args);27 server.startwork();34353637 public void init (string argv)throws exception38 39 int port = port_number;4040 if (argv.length > 0) 41 port = integer.parselnt (argv 0);434445 syste

7、m.out.println ("listening on port" + port);4646 / 分配-个 serversocketchannel47 serverchannel = serversocketchannel.open();48 / 从 serversocketchannel 里获得一个对应的 socket49 serversocket = serverchannel.socket();50 / 生成一个 selector51 selector = selector.open();5352 /把socket绑定到端口上53 serversocket.bind

8、 (new inetsocketaddress (port);54 /serverchannel 为非 bolck55 serverchannel.configureblocking (false);5856 / 通过 selector 注册 serversocetchannel57 serverchannel.register (selector, selectionkey.op_accept);61626364 public void startwork()throws exception6565 66 while (true) 6867 int n = selector.select()

9、;/获得 io 准备就绪的 channel 数虽7068 if(n = 0) 69 continue; /没有channel准备就绪,继续执行70 7471 / 用一个 iterator 返回 selector 的 selectedkeys72 iterator it = selector.selectedkeys().iterator();7773 / 处理每一个 sclcctionkcy74 while (it.hasnext() 75 selectionkey key = (selectionkey) it.next();8182/判断是否有新的连接到达83 if (key.isacce

10、ptable() 84 返回 selectionkey 的 serversocketchannel85 serversocketchannel server = (serversocketchannel) key.channel();86 socketchannel channel = server.accept();8787 registerchannel (selector, channel,88 selectionkey.op_read);9089 dowork (channel);90 9394/判断是否有数据在此channel里需要读取95 if (key.isreadable()

11、9696 processdata (key);9897 )10098 删除 selectedkeys99 it.remove();100 101 102 103 protected void registerchannel (selector selector,104 selectablechannel channel, int ops)105 throws exception106 107 if (channel = null) 108 return;109 113114110 channel.configureblocking (false);116117 channel.register

12、 (selector, ops);118 119119 处理接收的数据120 protected void proccssdata (sclcctionkcy key)121 throws exception122 124125123 socketchannel socketchannel = (socketchannel) key.channel();124 int count;128125 buffer.clear(); / 清空 buffer130131读取所有的数据132 while (count = socketchannel.read (buffer) > 0) 133 bu

13、ffer.flip();134134 / send the data, don't assume it goes all at once135 while (buffer.hasremainingo)136 137 如果收到回午键,贝ij在返回的字符前增加ccho$字样138 if(buffer.get()=(char) 13)139 140 buffer.clear();141 buffer.put(mechofckpdoquot;.getbytes();142 buffer.flipo;144143 144 socketchannel.write (buffer);/在 socket 里写数据145 148146 buffer.clear(); / 清空 buffer147 151148 if (count < 0) 153/count<0,说明已经读取完毕154 socketchannel.close();155 156 157158157 private void do work (socketchannel channel)throws exception158 159 buffer.clear();16

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论