欢迎来到天天文库
浏览记录
ID:30784052
大小:287.00 KB
页数:10页
时间:2019-01-03
《【javatcp-ipsocket】基于nio的tcp通信(含代码)-编程开发技术》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、【JavaTCP/IPSocket]基于NIO的TCP通信(含代码)-编程开发技术[JavaTCP/IPSocket]基于NIO的TCP通信(含代码)原文出处:兰亭风雨?NI0主要原理及使用NI0采取通道(Channel)和缓冲区(Buffer)来传输和保存数据,它是非阻塞式的I/O,即在等待连接、读写数据(这些都是在一线程以客户端的程序中会阻塞线程的操作)的时候,程序也可以做其他事情,以实现线程的异步操作。考虑一个即时消息服务器,可能冇上千个客户端同时连接到服务器,但是在任何时刻只有非常少量的消息需要读取和分发(如果采用线
2、程池或者一线程一客户端方式,则会非常浪费资源),这就需要一种方法能阻塞等待,直到有一个信道可以进行I/O操作。NTO的Selector选择器就实现了这样的功能,一个Selector实例可以同时检杳一组信道的I/O状态,它就类似一个观察者,只要我们把需要探知的SocketChannel告诉Selector,我们接着做别的事情,当冇事件(比如,连接打开、数据到达等)发生时,它会通知我们,传冋一组SelectionKey,我们读取这些Key,就会获得我们刚刚注册过的SocketChannel,然后,我们从这个Channel中读取数
3、据,接着我们口J以处理这些数据。Selector内部原理实际是在做一个对所注册的Channel的轮询访问,不断的轮询(目前就这一个算法),一旦轮询到一个Channe1冇所注册的事情发生,比如数据来了,它就会读取Channe1中的数据,并对其进行处理。耍使用选择器,需耍创建一个Selector实例,并将其注册到想耍监控的信道上(通过Charrne1的方法实现)。最后调用选择器的select()方法,该方法会阻塞等待,直到有一个或多个信道准备好了I/O操作或等待超时,或另一个线程调用了该选择器的wakeup()方法。现在,在一个
4、单独的线程中,通过调用select()方法,就能检杳多个信道是否准备好进行I/O操作,由于非阻塞I/O的界步特性,在检查的同时,我们也可以执行其他任务。基于NI0的TCP连接的建立步骤服务端1>传建一个Selector实例;2、将其注册到各种信道,并指定每个信道上感兴趣的I/O操作;3、重复执行:1)调用一种select()方法;2)获取选取的键列表;3)对于已选键集中的每个键:3、获取信道,并从键屮获取附件(如果为信道及其相关的key添加了附件的话);b、确定准备就绪的操纵并执行,如果是accept操作,将接收的信道设置为
5、非阻塞模式,并注册到选择器;c、如果需要,修改键的兴趣操作集;d、从已选键集中移除键客户端与基于多线程的TCP客户端大致相同,只是这里是通过信道建立的连接,但在等待连接建立及读写时,我们可以异步地执行其他任务。??基于NIO的TCP通信Demo下面给出一个基于NTO的TCP通信的Demo,客户端发送一串字符串到服务端,服务端将该字符吊原原本本地反馈给客户端。客户端代码及其详细注释如下:importjava.net.InetSocketAddress;importjava.net.SocketException;importj
6、ava.nio.ByteBuffer;importjava.nio.channels.SocketChanncl;publicclassTCPEchoClientNonblocking{publicstaticvoidmain(Stringargs[])throwsException{if((args,length<2)
7、
8、(args,length>3))thrownewIllcgalArgumcntException(〃参数不正确“);〃第一个参数作为要连接的服务端的主机名或1PStringserver二args[0];/
9、/第二个参数为要发送到服务端的字符串byte[]argument=args[l].getBytesO;//如果有第三个参数,则作为端口号,如果没有,则端口号设intservPort=(args・length==3)?Integer,parselnt(args[2]):7;//创建一个信道,并设为非阻塞模式SocketChannelclntChan二SocketChannel.open();clntChan.configurcBlocking(false);//向服务端发起连接if(!clntChan.connect(newI
10、netSocketAddress(server,servPort))){//不断地轮询连接状态,直到完成连接while(!clntChan.finishCormcctO){〃在等待连接的时间里,可以执行其他任务,以充分发挥非阻塞10的异步特性//这里为了演示该方法的使用,只是-•直打印…S
此文档下载收益归作者所有