JAVA NIO入门实例
jopen
10年前
NIO因为其高效性,成为了服务端的首选,大大提高了服务端的响应效率。以下是一个简单的DEMO。服务端:
package com.liuc.io; 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.nio.charset.Charset; import java.util.Iterator; import java.util.Set; import org.apache.log4j.Logger; public class NIOServer extends Thread { private Logger log=Logger.getLogger(NIOServer.class); private boolean stop=false; private String ip="localhost"; private int port=9999; private Selector selector; private ByteBuffer buffer=ByteBuffer.allocate(1024); private Charset gbkCharset = Charset.forName( "GB2312" ); public NIOServer() { try { selector=Selector.open(); ServerSocketChannel ssc=ServerSocketChannel.open(); InetSocketAddress address=new InetSocketAddress(ip, port); //ServerSocket绑定IP ssc.socket().bind(address); //设置为非阻塞模式 ssc.configureBlocking(false); //向选择器注册 ssc.register(selector,SelectionKey.OP_ACCEPT); System.out.println("Listen to port:"+port); } catch (IOException e) { log.error(e); } } @Override public void run() { System.out.println("deal with request"); while(!stop){ String content="HelloWorld"; try { int numKeys = selector.select(); Set<SelectionKey> selectionKeys=selector.selectedKeys(); Iterator<SelectionKey> iterator=selectionKeys.iterator(); while (iterator.hasNext()) { SelectionKey key = iterator.next(); iterator.remove(); dealRequest(key,content); } } catch (IOException e) { log.equals(e); } } } private void dealRequest(SelectionKey key,String contentToSend) { try { StringBuffer clientContent=new StringBuffer(); if(key.isAcceptable()){//测试此键的通道是否已准备好接受新的套接字连接。 ServerSocketChannel ssc=(ServerSocketChannel) key.channel(); SocketChannel sc=ssc.accept(); sc.configureBlocking(false); sc.register(selector, SelectionKey. OP_READ); }else if(key.isReadable()) {//测试此键的通道是否已准备好进行读取。 SocketChannel sc=(SocketChannel) key.channel(); while(true){//读取全部数据 buffer.clear(); int r=sc.read(buffer); buffer.flip(); byte[] temp=new byte[r]; if (r<=0) { break; } clientContent.append(gbkCharset.decode(buffer).toString()); } //获取全部的数据 String content=clientContent.toString(); String[] info=content.split(",");//用户名密码验证 System.out.println("客户端的验证请求为:"+content); sc.register(selector, SelectionKey.OP_WRITE); }else if(key.isWritable()){//测试此键的通道是否已准备好进行写入 System.out.println("要发送的消息为"+contentToSend); buffer.clear(); buffer.put(contentToSend.getBytes()); buffer.flip(); SocketChannel sc = (SocketChannel)key.channel(); sc.write(buffer); buffer.flip(); //发送完信息后关闭连接 key.cancel(); sc.close(); } } catch (IOException e) { System.out.println(e); //客户端断开连接,所以从Selector中取消注册 key.cancel(); if(key.channel() != null) try { key.channel().close(); log.debug("the client socket is closed!"); //System.out.println("the client socket is closed!"); } catch (IOException e1) { e1.printStackTrace(); } } } public static void main(String[] args){ new NIOServer().start(); } }客户端:
package com.liuc.io; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.Socket; import java.net.UnknownHostException; public class NIOClient { /** * @param args */ public static void main(String[] args) { Socket socket=null; OutputStream outputStream=null; InputStream inputStream=null; try { socket=new Socket("localhost", 9999); outputStream=socket.getOutputStream(); String sendContent="HelloWorld"; outputStream.write(sendContent.getBytes()); outputStream.flush(); inputStream=socket.getInputStream(); byte[] bytes=new byte[1024]; int n=inputStream.read(bytes); System.out.println(new String(bytes)); } catch (UnknownHostException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally{ try { if(inputStream!=null){ inputStream.close(); } if (outputStream!=null) { outputStream.close(); } if (socket!=null) { socket.close(); } } catch (IOException e) { e.printStackTrace(); } } } }来自:http://blog.csdn.net/shanhuhau/article/details/8728594