• NIO-3网络通信


    import java.io.IOException;
    import java.net.InetSocketAddress;
    import java.nio.ByteBuffer;
    import java.nio.channels.FileChannel;
    import java.nio.channels.ServerSocketChannel;
    import java.nio.channels.SocketChannel;
    import java.nio.file.Paths;
    import java.nio.file.StandardOpenOption;
    
    import org.junit.Test;
    
    /*
     * 一、使用 NIO 完成网络通信的三个核心:
     * 
     * 1. 通道(Channel):负责连接
     *         
     *        java.nio.channels.Channel 接口:
     *             |--SelectableChannel
     *                 |--SocketChannel
     *                 |--ServerSocketChannel
     *                 |--DatagramChannel
     * 
     *                 |--Pipe.SinkChannel
     *                 |--Pipe.SourceChannel
     * 
     * 2. 缓冲区(Buffer):负责数据的存取
     * 
     * 3. 选择器(Selector):是 SelectableChannel 的多路复用器。用于监控 SelectableChannel 的 IO 状况
     * 
     */
    public class TestBlockingNIO {
    
        //客户端
        @Test
        public void client() throws IOException{
            //1. 获取通道
            SocketChannel sChannel = SocketChannel.open(new InetSocketAddress("127.0.0.1", 9898));
            
            FileChannel inChannel = FileChannel.open(Paths.get("1.jpg"), StandardOpenOption.READ);
            
            //2. 分配指定大小的缓冲区
            ByteBuffer buf = ByteBuffer.allocate(1024);
            
            //3. 读取本地文件,并发送到服务端
            while(inChannel.read(buf) != -1){
                buf.flip();
                sChannel.write(buf);
                buf.clear();
            }
            
            //4. 关闭通道
            inChannel.close();
            sChannel.close();
        }
        
        //服务端
        @Test
        public void server() throws IOException{
            //1. 获取通道
            ServerSocketChannel ssChannel = ServerSocketChannel.open();
            
            FileChannel outChannel = FileChannel.open(Paths.get("2.jpg"), StandardOpenOption.WRITE, StandardOpenOption.CREATE);
            
            //2. 绑定连接
            ssChannel.bind(new InetSocketAddress(9898));
            
            //3. 获取客户端连接的通道
            SocketChannel sChannel = ssChannel.accept();
            
            //4. 分配指定大小的缓冲区
            ByteBuffer buf = ByteBuffer.allocate(1024);
            
            //5. 接收客户端的数据,并保存到本地
            while(sChannel.read(buf) != -1){
                buf.flip();
                outChannel.write(buf);
                buf.clear();
            }
            
            //6. 关闭通道
            sChannel.close();
            outChannel.close();
            ssChannel.close();
            
        }
        
    }

    客户端服务端的响应交互

    import java.io.IOException;
    import java.net.InetSocketAddress;
    import java.nio.ByteBuffer;
    import java.nio.channels.FileChannel;
    import java.nio.channels.ServerSocketChannel;
    import java.nio.channels.SocketChannel;
    import java.nio.file.Paths;
    import java.nio.file.StandardOpenOption;
    
    import org.junit.Test;
    
    public class TestBlockingNIO2 {
        
        //客户端
        @Test
        public void client() throws IOException{
            SocketChannel sChannel = SocketChannel.open(new InetSocketAddress("127.0.0.1", 9898));
            
            FileChannel inChannel = FileChannel.open(Paths.get("1.jpg"), StandardOpenOption.READ);
            
            ByteBuffer buf = ByteBuffer.allocate(1024);
            
            while(inChannel.read(buf) != -1){
                buf.flip();
                sChannel.write(buf);
                buf.clear();
            }
            
            sChannel.shutdownOutput();
            
            //接收服务端的反馈
            int len = 0;
            while((len = sChannel.read(buf)) != -1){
                buf.flip();
                System.out.println(new String(buf.array(), 0, len));
                buf.clear();
            }
            
            inChannel.close();
            sChannel.close();
        }
        
        //服务端
        @Test
        public void server() throws IOException{
            ServerSocketChannel ssChannel = ServerSocketChannel.open();
            
            FileChannel outChannel = FileChannel.open(Paths.get("2.jpg"), StandardOpenOption.WRITE, StandardOpenOption.CREATE);
            
            ssChannel.bind(new InetSocketAddress(9898));
            
            SocketChannel sChannel = ssChannel.accept();
            
            ByteBuffer buf = ByteBuffer.allocate(1024);
            
            while(sChannel.read(buf) != -1){
                buf.flip();
                outChannel.write(buf);
                buf.clear();
            }
            
            //发送反馈给客户端
            buf.put("服务端接收数据成功".getBytes());
            buf.flip();
            sChannel.write(buf);
            
            sChannel.close();
            outChannel.close();
            ssChannel.close();
        }
    
    }
  • 相关阅读:
    ofbiz初级教程
    IBASE4J开发环境搭建
    Nginx在windows上安装 及 Nginx的配置及优化
    Windows里正确安装Zookeeper以服务运行
    分享一个完整的Mybatis分页解决方案
    jquery weui ajax滚动加载更多
    Spring+Mybatis+SpringMVC后台与前台分页展示实例
    Mysql怎么样避免全表扫描,sql查询优化
    SQL优化|Java面试题
    mysql 全表扫描、全索引扫描、索引覆盖(覆盖索引)
  • 原文地址:https://www.cnblogs.com/surge/p/10476099.html
Copyright © 2020-2023  润新知