首页 > 代码库 > JAVA NIO

JAVA NIO

参考文章:

http://weixiaolu.iteye.com/blog/1479656

http://developer.51cto.com/art/201112/307463.htm

 

NIO服务端

package com.meso.nio;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 ServerSocketChannel serverChannel;    private Selector selector;    private int port;    public NIOServer(int port) {        this.port = port;    }    public void initServer() throws IOException {        System.out.println("开始初始化服务端");        serverChannel = ServerSocketChannel.open();        serverChannel.configureBlocking(false);        serverChannel.socket().bind(new InetSocketAddress(port));        selector = Selector.open();        serverChannel.register(selector, SelectionKey.OP_ACCEPT);        System.out.println("服务端初始化完毕");    }    public void listen() throws IOException {        System.out.println("开始监听");        while (true) {            int num = selector.select();            System.out.println("新事件数目:" + num);            Iterator it = selector.selectedKeys().iterator();            while (it.hasNext()) {                SelectionKey key = (SelectionKey) it.next();                it.remove();                if (key.isAcceptable()) {                    ServerSocketChannel server = (ServerSocketChannel) key                            .channel();                    SocketChannel channel = server.accept();                    channel.configureBlocking(false);                    channel.write(ByteBuffer.wrap(new String("向客户端发送了一条信息")                            .getBytes()));                    channel.register(this.selector, SelectionKey.OP_READ);                } else if (key.isReadable()) {                    SocketChannel channel = (SocketChannel) key.channel();                    ByteBuffer buffer = ByteBuffer.allocate(1024);                    buffer.clear();                    channel.read(buffer);                    String msg = new String(buffer.array()).trim();                    System.out.println("服务端收到信息:" + msg);                    buffer.flip();                    channel.write(buffer);                }            }        }    }    public void close() {        if (selector != null) {            try {                selector.close();            } catch (IOException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }        }        if (serverChannel != null) {            try {                serverChannel.close();            } catch (IOException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }        }    }    public static void main(String[] args) {        NIOServer server = new NIOServer(9999);        try {            server.initServer();            server.listen();        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } finally {            server.close();        }    }}

 

NIO客户端

package com.meso.nio;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.SocketChannel;import java.util.Iterator;public class NIOClient {    private Selector selector;    private SocketChannel channel;    private String ip;    private int port;    public NIOClient(String ip, int port) {        this.ip = ip;        this.port = port;    }    public void initClient() throws IOException {        System.out.println("客户端开始初始化");        channel = SocketChannel.open();        channel.configureBlocking(false);        this.selector = Selector.open();        channel.connect(new InetSocketAddress(ip, port));        channel.register(selector, SelectionKey.OP_CONNECT);        System.out.println("客户端初始化完毕");    }    public void listen() throws IOException {        System.out.println("开始监听");        while (true) {            int num = selector.select();            System.out.println("新事件数目:" + num);            Iterator ite = this.selector.selectedKeys().iterator();            while (ite.hasNext()) {                SelectionKey key = (SelectionKey) ite.next();                ite.remove();                if (key.isConnectable()) {                    SocketChannel channel = (SocketChannel) key.channel();                    if (channel.isConnectionPending()) {                        channel.finishConnect();                    }                    channel.configureBlocking(false);                    channel.write(ByteBuffer.wrap(new String("向服务端发送了一条信息")                            .getBytes()));                    channel.register(this.selector, SelectionKey.OP_READ);                } else if (key.isReadable()) {                    SocketChannel channel = (SocketChannel) key.channel();                    ByteBuffer buffer = ByteBuffer.allocate(100);                    buffer.clear();                    channel.read(buffer);                    String msg = new String(buffer.array()).trim();                    System.out.println("客户端收到信息:" + msg);                    buffer.flip();                    channel.write(buffer);                }            }        }    }    public void close() {        if (selector != null) {            try {                selector.close();            } catch (IOException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }        }        if (channel != null) {            try {                channel.close();            } catch (IOException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }        }    }    public static void main(String[] args) {        NIOClient client = new NIOClient("localhost", 9999);        try {            client.initClient();            client.listen();        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } finally {            client.close();        }    }}

 

JAVA NIO