美文网首页
NIO Server基本示例

NIO Server基本示例

作者: JohnYuCN | 来源:发表于2019-11-27 16:46 被阅读0次

    使用Channel完成文件复制

    package cn.johnyu;
    
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.nio.ByteBuffer;
    import java.nio.channels.FileChannel;
    
    public class Test1 {
        public static void main(String[] args) throws Exception{
            FileInputStream inputStream=new FileInputStream("abc.txt");
            FileOutputStream outputStream=new FileOutputStream("abc2.txt");
            FileChannel inChannel= inputStream.getChannel();
            FileChannel outChannel= outputStream.getChannel();
            ByteBuffer buffer=ByteBuffer.allocate(2);
            while (true) {
                int rs = inChannel.read(buffer);
                if(rs==-1) break;
                buffer.flip();
                outChannel.write(buffer);
                buffer.clear();
            }
    
        }
    }
    

    基于TCP完成服务器与客户机并发对话

    package cn.johnyu;
    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 Selector selector;
    
        public void initServer(int port) throws IOException {
            // 获得一个ServerSocketChannel通道
            ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
            // 设置通道为非阻塞
            serverSocketChannel.configureBlocking(false);
            // 将该通道对应的ServerSocket绑定到port端口     
            serverSocketChannel.bind(new InetSocketAddress(port));
            // 获得一个通道管理器
            this.selector = Selector.open();
            // 将通道管理器和该通道绑定,并为该通道注册SelectionKey.OP_ACCEPT事件,注册该事件后,
            // 当该事件到达时,selector.select()会返回,如果该事件没到达selector.select()会一直阻塞。
            serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
        }
    
        public void listen() throws IOException {
            System.out.println("服务端启动成功!");
            // 轮询访问selector
            while (true) {
                // 当注册的事件到达时,方法返回;否则,该方法会一直阻塞
                selector.select();
                // 获得selector中选中的项的迭代器,选中的项为注册的事件
                Iterator<SelectionKey> ite = this.selector.selectedKeys().iterator();
                while (ite.hasNext()) {
                    SelectionKey key = (SelectionKey) ite.next();
                    // 删除已选的key,以防重复处理
                    ite.remove();
                    
                    if (key.isAcceptable()) {// 客户端请求连接事件
                        ServerSocketChannel server = (ServerSocketChannel) key.channel();
                        // 获得和客户端连接的通道
                        SocketChannel channel = server.accept();
                        // 设置成非阻塞
                        channel.configureBlocking(false);
     
                        // 在这里可以给客户端发送信息哦
                        channel.write(ByteBuffer.wrap(new String("向客户端发送了一条信息")
                                .getBytes("utf-8")));
                        // 在和客户端连接成功之后,为了可以接收到客户端的信息,需要给通道设置读的权限。
                        channel.register(this.selector, SelectionKey.OP_READ);
                        
                    } else if (key.isReadable()) {// 获得了可读的事件
                        read(key);
                    }
                }
     
            }
        }
    
        public void read(SelectionKey key) throws IOException {
            // 服务器可读取消息:得到事件发生的Socket通道
            SocketChannel channel = (SocketChannel) key.channel();
            // 创建读取的缓冲区
            ByteBuffer buffer = ByteBuffer.allocate(512); 
            channel.read(buffer);
            byte[] data = buffer.array();
            String msg = new String(data).trim();
            System.out.println("服务端收到信息:" + msg);
            ByteBuffer outBuffer = ByteBuffer.wrap(msg.getBytes("utf-8"));
            channel.write(outBuffer);// 将消息回送给客户端
        }
    
        public static void main(String[] args) throws IOException {
            NIOServer server = new NIOServer();
            server.initServer(8000);
            server.listen();
        }
    }
    

    相关文章

      网友评论

          本文标题:NIO Server基本示例

          本文链接:https://www.haomeiwen.com/subject/boapwctx.html