NIO代码实例分享

 

(1)server主要是读取client发过来的信息,并返回一条信息

 

 

/**
 * @author Jeff
 */
public class HelloWorldServer {

    static int               BLOCK        = 1024;
    static String            name         = "";
    protected Selector       selector;
    protected ByteBuffer     clientBuffer = ByteBuffer.allocate(BLOCK);
    protected CharsetDecoder decoder;
    static CharsetEncoder    encoder      = Charset.forName("GB2312").newEncoder();

    public HelloWorldServer(int port) throws IOException{
        selector = this.getSelector(port);
        Charset charset = Charset.forName("GB2312");
        decoder = charset.newDecoder();
    }

    // 获取Selector
    protected Selector getSelector(int port) throws IOException {
        ServerSocketChannel server = ServerSocketChannel.open();
        Selector sel = Selector.open();
        server.socket().bind(new InetSocketAddress(port));
        server.configureBlocking(false);
        server.register(sel, SelectionKey.OP_ACCEPT);
        return sel;
    }

    // 监听端口
    public void listen() {
        try {
            for (;;) {
                selector.select();
                Iterator iter = selector.selectedKeys().iterator();
                while (iter.hasNext()) {
                    SelectionKey key = (SelectionKey) iter.next();
                    iter.remove();
                    process(key);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    // 处理事件
    protected void process(SelectionKey key) throws IOException {
        if (key.isAcceptable()) { // 接收请求
            ServerSocketChannel server = (ServerSocketChannel) key.channel();
            SocketChannel channel = server.accept();
            // 设置非阻塞模式
            channel.configureBlocking(false);
            channel.register(selector, SelectionKey.OP_READ);
        } else if (key.isReadable()) { // 读信息
            SocketChannel channel = (SocketChannel) key.channel();
            int count = channel.read(clientBuffer);
            if (count > 0) {
                clientBuffer.flip();
                CharBuffer charBuffer = decoder.decode(clientBuffer);
                name = charBuffer.toString();
                // System.out.println(name);
                SelectionKey sKey = channel.register(selector, SelectionKey.OP_WRITE);
                sKey.attach(name);
            } else {
                channel.close();
            }

            clientBuffer.clear();
        } else if (key.isWritable()) { // 写事件
            SocketChannel channel = (SocketChannel) key.channel();
            String name = (String) key.attachment();

            ByteBuffer block = encoder.encode(CharBuffer.wrap("Hello !" + name));

            channel.write(block);

            // channel.close();

        }
    }

    public static void main(String[] args) {
        int port = 8888;
        try {
            HelloWorldServer server = new HelloWorldServer(port);
            System.out.println("listening on " + port);

            server.listen();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
 

 

(2)client端代码

 

 

 /** 
  *  
  * @author Jeff 
  * 
  */  
 public class HelloWorldClient {  
   
     static int SIZE = 10;  
     static InetSocketAddress ip = new InetSocketAddress("localhost", 8888);  
     static CharsetEncoder encoder = Charset.forName("GB2312").newEncoder();  
   
     static class Message implements Runnable {  
         protected String name;  
         String msg = "";  
   
         public Message(String index) {  
             this.name = index;  
         }  
   
         public void run() {  
             try {  
                 long start = System.currentTimeMillis();  
                 //打开Socket通道  
                 SocketChannel client = SocketChannel.open();  
                 //设置为非阻塞模式  
                 client.configureBlocking(false);  
                 //打开选择器  
                 Selector selector = Selector.open();  
                 //注册连接服务端socket动作  
                 client.register(selector, SelectionKey.OP_CONNECT);  
                 //连接  
                 client.connect(ip);  
                 //分配内存  
                 ByteBuffer buffer = ByteBuffer.allocate(8 * 1024);  
                 int total = 0;  
   
                 _FOR: for (;;) {  
                     selector.select();  
                     Iterator iter = selector.selectedKeys().iterator();  
   
                     while (iter.hasNext()) {  
                         SelectionKey key = (SelectionKey) iter.next();  
                         iter.remove();  
                         if (key.isConnectable()) {  
                             SocketChannel channel = (SocketChannel) key  
                                     .channel();  
                             if (channel.isConnectionPending())  
                                 channel.finishConnect();  
                             channel  
                                     .write(encoder  
                                             .encode(CharBuffer.wrap(name)));  
   
                             channel.register(selector, SelectionKey.OP_READ);  
                         } else if (key.isReadable()) {  
                             SocketChannel channel = (SocketChannel) key  
                                     .channel();  
                             int count = channel.read(buffer);  
                             if (count > 0) {  
                                 total += count;  
                                 buffer.flip();  
   
                                 while (buffer.remaining() > 0) {  
                                     byte b = buffer.get();  
                                     msg += (char) b;  
                                       
                                 }  
   
                                 buffer.clear();  
                             } else {  
                                 client.close();  
                                 break _FOR;  
                             }  
                         }  
                     }  
                 }  
                 double last = (System.currentTimeMillis() - start) * 1.0 / 1000;  
                 System.out.println(msg + "used time :" + last + "s.");  
                 msg = "";  
             } catch (IOException e) {  
                 e.printStackTrace();  
             }  
         }  
     }  
   
     public static void main(String[] args) throws IOException {  
       
         String names[] = new String[SIZE];  
   
         for (int index = 0; index < SIZE; index++) {  
             names[index] = "jeff[" + index + "]";  
             new Thread(new Message(names[index])).start();  
         }  
       
     }  
 } 
 

 

转载地址:http://ecjtu05.blog.sohu.com/119571227.html

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值