zoukankan      html  css  js  c++  java
  • NIO的简单Demo

    package jesse.test1;
    
    import java.io.IOException;
    import java.net.InetAddress;
    import java.net.InetSocketAddress;
    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;
    
    public class NIOServer extends Thread{
        
        @Override
        public void run(){
            try {
                // 1,创建Selector 和 Channel
                Selector selector = Selector.open();
                ServerSocketChannel serverSocket = ServerSocketChannel.open();
                //
                serverSocket.bind(new InetSocketAddress(InetAddress.getLocalHost(), 8888));
                serverSocket.configureBlocking(false);
                // 注册到Selector,并说明关注点
                serverSocket.register(selector, SelectionKey.OP_ACCEPT);
                while(true){
                    //阻塞等待就绪的Channel
                    selector.select();
                    Set<SelectionKey> selectedKeys = selector.selectedKeys();
                    Iterator<SelectionKey> iter = selectedKeys.iterator();
                    while(iter.hasNext()){
                        SelectionKey key = iter.next();
                        // 生产中一般会额外进行就绪状态检查
                        sayHelloWorld((ServerSocketChannel) key.channel());
                        iter.remove();
                    }
                }
                
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        
        private void sayHelloWorld(ServerSocketChannel server){
            try {
                SocketChannel client = server.accept();
                client.write(Charset.defaultCharset().encode("hello World."));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        
        public static void main(String[] args) {
            /*NIOServer server = new NIOServer();
            server.start();
            try {
                Socket client = new Socket(InetAddress.getLocalHost(), 8888);
                BufferedReader bufferReader = new BufferedReader(new InputStreamReader(client.getInputStream()));
                System.out.println(bufferReader.readLine());
                
            } catch (IOException e) {
                e.printStackTrace();
            }*/
            System.out.println("hello world");
            ThreadGroup group = Thread.currentThread().getThreadGroup();
            ThreadGroup topGroup = group;
            while (group != null) {
            topGroup = group;
            group = group.getParent();
            }
            int nowThreads = topGroup.activeCount();
            Thread[] lstThreads = new Thread[nowThreads];
            topGroup.enumerate(lstThreads);
            for (int i = 0; i < nowThreads; i++) {
            System.out.println("线程number:" + i + " = " + lstThreads[i].getName());
            }
    
        }
    }
    /**
     * 1、通过Selector.open 创建Selector,类似调度员
     * 2、创建一个ServerSocketChannel,并且注册到Selector上,指定SelectionKey.OP_ACCEPT,接收新的连接请求
     * 3、Selector阻塞在select请求,当有Channel发生接入请求,会被唤醒
     * 4、通过SocketChannel和Buffer进行数据操作,
     */
    

      

  • 相关阅读:
    Travis 编译使用 JDK 的版本
    《程序员的职业素养》读书笔记
    先做人,在做事
    CAP理论
    ZGC实践
    虚拟化技术的分类及介绍
    C# AD域验证登录
    dotnet core 3.1 站点发布成windows服务
    windows 服务无法调用office word COM接口
    Ext 动态加载js文件
  • 原文地址:https://www.cnblogs.com/atomicbomb/p/9965112.html
Copyright © 2011-2022 走看看