Java NIO通信编程

NIO即非同步非阻塞式IO,有如下几个特点:

1.创建一个线程负责处理IO事件和IO事件的分发

2.事件驱动机制,事件到达之后触发

3.线程之间通过wait、notify等方式通信,减少线程间切换

NIO客户端和服务端需都维护一个管理通道的对象selector,该对象能检测一个或多个通道channel上事件,服务端线程轮询selector,事件到达再处理。

服务端例程

package com.zjl.socket

import java.io.IOException;

import java.net.InetSocketAddress;

import java.nio.ByteBuffer;

import java.nio.channels.SelectionKey;

import java.nio.channels.Selector;

import java.nio.channels.ServerSocketChannel;

import java.nio.channels.SocketChannel;

import java.util.Iterator;

public class NioServer {

private Selector selector;

  public void initServer(int port) throws IOException {

  ServerSocketChannel serverChannel = ServerSocketChannek.open():

  serverChannel.configureBlocking(false);

  serverChannek.configureBlocking(false);

  serverChannel.socket( ).bind(new InetSocketAddress(port));

   this.selector = Selector.open();

   serverChannel.register(selector, SelectionKey.OP_ACCECPT);

}

 public void listen( )  throws IOException {

     System.outprintln("服务器启动成功“);

     while(true)   {

         selector.select( );

         Iterator ite = this.selector.selectedKeys( ).iterator( );

         while(ite.hasNext( ) {

              SelectionKey key = (SelectionKey) ite.next( );

              ite.remove( );

              if (key.isAcceptable( )) {

                     ServerSocketChannel server = (ServerSocketChannel) key.channel( );

                     SocketChannel channel =server.accept ( );

                     channel.configureBlocking(false);

                     channel.write(ByteBuffer.wrap(new String("12345678").getBytes( )));

                     channel.register(this.selector,SelectionKey.OP_READ); }

                     else if (key.isReadable ( ))  {

                        read(key);

                      }

                   }

             }

  }

 public void read(SelectionKey key) thows IOException {

          SocketChannel channel = (SocketChannel) key.channel( );

          ByteBuffer buffer = ByteBuffer.allocate(10);

         channel.read(buffer);

         byte[ ] data = buffer.array( );

         String msg = new String(data).trim( );

         ByteBuffer outBuffer =  ByteBuffer.wrap(msg.getBytes( ));

         channel.write(outBuffer);

 }

  public static void main(String[ ] args) thows IOException {

  AioServer server = new AioServer( );

  server.initServer(8100);

  server.listen( );

  }

}

猜你喜欢

转载自blog.csdn.net/xinsuiqingfeng/article/details/81273299
今日推荐