• 利用NIO的Selector处理服务器-客户端模型


    package NIOTEST;
    
    
    import java.io.IOException;
    import java.net.InetAddress;
    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;
    import java.util.Set;
    
    public class NIOServer {
        public static void main(String[] args) throws IOException, InterruptedException {
            Selector selector = Selector.open();
    
            ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
            InetSocketAddress address = new InetSocketAddress(InetAddress.getLocalHost(), 8080);
            serverSocketChannel.socket().bind(address);
            serverSocketChannel.configureBlocking(false);
            serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
    
            while (true) {
                if (selector.select() > 0) {
                    Set<SelectionKey> selectionKeys = selector.selectedKeys();
                    Iterator<SelectionKey> it = selectionKeys.iterator();
                    while (it.hasNext()) {
                        SelectionKey selectionKey = it.next();
                        if (selectionKey.isAcceptable()) {
                            serverSocketChannel = (ServerSocketChannel)selectionKey.channel();
                            SocketChannel socketChannel = serverSocketChannel.accept();
                            socketChannel.configureBlocking(false);
                            socketChannel.register(selector, SelectionKey.OP_READ);
                            System.out.println("Connected: " + socketChannel.socket().getRemoteSocketAddress());
                        } else if (selectionKey.isReadable()) {
                            SocketChannel socketChannel = (SocketChannel) selectionKey.channel();
                            ByteBuffer buffer = ByteBuffer.allocate(1024);
                            while (socketChannel.read(buffer) > 0) {
                                buffer.flip();
                                byte[] dis = new byte[buffer.limit()];
                                buffer.get(dis);
                                System.out.println("当前线程="+Thread.currentThread().getId()+"--"+new String(dis));
                            }
                        }
    
                        it.remove();
                    }
                }
    
                Thread.sleep(100);
            }
        }
    }

    客户端

    package NIOTEST;
    
    import java.io.IOException;
    import java.net.InetAddress;
    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.text.SimpleDateFormat;
    import java.util.Date;
    import java.util.Iterator;
    import java.util.Set;
    public class NIOClient {
        public static void main(String[] args) throws IOException {
            SocketChannel socketChannel = SocketChannel.open();
            InetSocketAddress address = new InetSocketAddress(InetAddress.getLocalHost(), 8080);
            socketChannel.socket().connect(address);
    
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    
            ByteBuffer buffer = ByteBuffer.allocate(1024);
            while (true) {
                try {
                    buffer.clear();
                    String time = sdf.format(new Date());
                    buffer.put(time.getBytes());
                    buffer.flip();
                    socketChannel.write(buffer);
                    Thread.sleep(5000);
                } catch (Exception e) {
                    System.out.println("Connection Close");
                    break;
                }
            }
        }
    }
    View Code
  • 相关阅读:
    关于各种好玩的神奇函数
    模板——AC自动机
    模板——造数据
    VIM常用操作
    springboot注解
    面试题
    Linux常用命令
    Zookeeper
    对cpu与load的理解及线上问题处理思路
    top
  • 原文地址:https://www.cnblogs.com/tiancai/p/8944705.html
Copyright © 2020-2023  润新知