JAVA nio 简单使用

Posted duangl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA nio 简单使用相关的知识,希望对你有一定的参考价值。

nio 模拟客户端和服务器互相通讯--传输一个int值,并且不断的+1;
服务器

public class Server 
    public static void main(String[] args) 
        try 
            ServerSocketChannel server=ServerSocketChannel.open().bind(new InetSocketAddress(8881));
            server.configureBlocking(false);
            Selector selector=Selector.open();
            server.register(selector,SelectionKey.OP_ACCEPT);
            for(;;) 
                selector.select();
                Set<SelectionKey> keys = selector.selectedKeys();
                Iterator<SelectionKey> iterator = keys.iterator();
                while(iterator.hasNext()) 
                    SelectionKey next = iterator.next();
                    if(next.isAcceptable()) 
                        acceptHandle(next, selector);
                    
                    if (next.isReadable()) 
                        doRead(next, selector);
                    
                    iterator.remove();
                
                Thread.sleep(2000);
            
         catch (IOException e) 
            // TODO Auto-generated catch block
            e.printStackTrace();
         catch (InterruptedException e) 
            // TODO Auto-generated catch block
            e.printStackTrace();
        
    
    public static void acceptHandle(SelectionKey key,Selector selector) throws IOException 
        ServerSocketChannel serverShannel =(ServerSocketChannel) key.channel();
        SocketChannel channel = serverShannel.accept();
        channel.configureBlocking(false);
        channel.register(selector, SelectionKey.OP_READ,ByteBuffer.allocate(1024));
    
    public static  void doRead(SelectionKey key,Selector selector) throws IOException 
        SocketChannel socketChannel = (SocketChannel) key.channel();
        ByteBuffer buffer =(ByteBuffer) key.attachment();
        buffer.clear();
        int read = socketChannel.read(buffer);
        int msg=buffer.getInt(0);
        System.out.println("服务器收到客户端"+socketChannel.getLocalAddress()+"  "+msg);
        buffer.rewind();
        buffer.putInt(msg+1);
        buffer.flip();
        socketChannel.write(buffer);
        //buffer.clear();
    

客户端

public class Client 
    public static void main(String[] args) 
        try(SocketChannel channel=SocketChannel.open();
            Selector selector=Selector.open();
                ) 
            channel.configureBlocking(false);
            if(!channel.connect(new InetSocketAddress("127.0.0.1", 8881))) 
                while(!channel.finishConnect()) ;
                System.out.println("连接到服务器");
            
            
            ByteBuffer buffer = ByteBuffer.allocate(1024);
            buffer.putInt(1);
            buffer.flip();
            channel.write(buffer);
            channel.register(selector, SelectionKey.OP_READ,buffer);
            for(;;) 
                selector.select();
                Set<SelectionKey> keys = selector.selectedKeys();
                Iterator<SelectionKey> iterator = keys.iterator();
                while(iterator.hasNext()) 
                    SelectionKey next = iterator.next();
                    if(next.isReadable()) 
                        doRead(next,selector);
                    
                    iterator.remove();
                
                Thread.sleep(2000);
            
         catch (IOException e) 
            // TODO Auto-generated catch block
            e.printStackTrace();
         catch (InterruptedException e) 
            // TODO Auto-generated catch block
            e.printStackTrace();
        
    
    public static void doRead(SelectionKey key,Selector selector) throws IOException 
        SocketChannel socketChannel = (SocketChannel) key.channel();
        ByteBuffer buffer =(ByteBuffer) key.attachment();
        buffer.clear();
        socketChannel.read(buffer);
        int msg=buffer.getInt(0);
        System.out.println("客户端收到服务器返回的信息"+socketChannel.getLocalAddress()+"  "+msg);
        buffer.putInt(0,msg+1);
        buffer.flip();
        socketChannel.write(buffer);
        
    
    

以上是关于JAVA nio 简单使用的主要内容,如果未能解决你的问题,请参考以下文章

浅尝Java NIO与Tomcat简单连接调优

Java NIO

Java网络编程基础— 基于TCP的NIO简单聊天系统

使用 java.nio.file.Paths 接口时缺少方案 (IllegalArgumentException)

为什么不建议使用 Java 原生 NIO?

java原生NIO实现客户端服务端简单通讯