• NIO实现的客户端和服务端


    学习NIO通信笔记   可直接执行
    public class NIOServer {
    
        private static int BUFF_SIZE=1024;
        private static int TIME_OUT = 2000;
    
        public static void main(String[] args) throws IOException {
    
            Selector selector = Selector.open();
            ServerSocketChannel serverSocketChannel=ServerSocketChannel.open();
            serverSocketChannel.bind(new InetSocketAddress(10083));
            serverSocketChannel.configureBlocking(false);
            serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
            TCPProtocol protocol = new EchoSelectorProtocol(BUFF_SIZE);
            while (true) {
                if(selector.select(TIME_OUT)==0){
                    //在等待信道准备的同时,也可以异步地执行其他任务,  这里打印*
                    System.out.print("*");
                    continue;
                }
                Iterator<SelectionKey> keyIter = selector.selectedKeys().iterator();
                while (keyIter.hasNext()) {
                    SelectionKey key = keyIter.next();
                    //如果服务端信道感兴趣的I/O操作为accept
                    if (key.isAcceptable()){
                        protocol.handleAccept(key);
                    }
                    //如果客户端信道感兴趣的I/O操作为read
                    if (key.isReadable()){
                        protocol.handleRead(key);
                    }
                    //如果该键值有效,并且其对应的客户端信道感兴趣的I/O操作为write
                    if (key.isValid() && key.isWritable()) {
                        protocol.handleWrite(key);
                    }
                    //这里需要手动从键集中移除当前的key
                    keyIter.remove();
                }
    
            }
        }
    }
    public class NIOClient {
    
        public static Selector selector;
        public static SocketChannel clntChan;
    
        static {
            try {
                selector = Selector.open();
                clntChan = SocketChannel.open();
                clntChan.configureBlocking(false);
                clntChan.connect(new InetSocketAddress("localhost", 10083));
                clntChan.register(selector, SelectionKey.OP_READ);
                while (!clntChan.finishConnect()){
    
                }
                System.out.println("已连接!");
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    
        public static void main(String[] args) throws IOException {
                SocketChannel socketChannel = NIOClient.clntChan;
                ByteBuffer byteBuffer = ByteBuffer.allocate(256);
                new Avca(selector,socketChannel).start();
                while (true){
                    Scanner scanner = new Scanner(System.in);
                    String word = scanner.nextLine();
                    byteBuffer.put(word.getBytes());
                    byteBuffer.flip();
                    socketChannel.write(byteBuffer);
                    byteBuffer.clear();
                }
        }
    
        static class Avca extends Thread{
            private Selector selector;
            private SocketChannel clntChan;
    
           public Avca(Selector selector,SocketChannel clntChan){
                this.selector = selector;
                this.clntChan = clntChan;
           }
    
            @Override
            public void run(){
                try {
                    while (true){
                        selector.select();
                        Set<SelectionKey> keys = selector.selectedKeys();
                        Iterator<SelectionKey> keyIterator = keys.iterator();
                        ByteBuffer byteBuffer = ByteBuffer.allocate(256);
                        while (keyIterator.hasNext()){
                            SelectionKey selectionKey = keyIterator.next();
                            if (selectionKey.isValid()){
                                if (selectionKey.isReadable()){
                                    SocketChannel socketChannel = (SocketChannel)selectionKey.channel();
                                    socketChannel.read(byteBuffer);
                                    byteBuffer.flip();
                                    byte[] bytes = new byte[byteBuffer.remaining()];
                                    byteBuffer.get(bytes);
                                    System.out.println(new String(bytes));
                                    byteBuffer.clear();
                                }
                            }
                        }
                    }
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
        }
    
    }
  • 相关阅读:
    android常用组件
    android button点击效果
    service+activity
    收藏
    c++
    工厂模式
    lr常遇到一些问题
    lr介绍
    ((1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(6) NOT NULL)' at line 1"))
    mysqlclient 1.4.0 or newer is required; you have 0.10.0
  • 原文地址:https://www.cnblogs.com/xzn-smy/p/9100064.html
Copyright © 2020-2023  润新知