NIO는에 차단하고 IO 비 차단. NIO 완벽한 통신 네트워크

비 차단 차단 

전통적인 IO는 흐름을 차단하고 있습니다. 즉, 일부 데이터를 읽거나 그 동안 스레드가 다른 작업을하지를 수행 할 수 있습니다에 기록 할 수있을 때까지 스레드 호출을 읽을 때 () 또는 쓰기 (), 스레드가 차단됩니다 . 스레드가 차단되어 있기 때문에, 통신 네트워크 IO 동작의 완료시, 그래서 서버는 서버의 요구는 클라이언트가 다수의 성능의 급격한 하락을 처리 할 때, 각 클라이언트에 대한 처리를위한 별도의 쓰레드를 가져야한다.

 자바 NIO는 비 블로킹 모드입니다. 스레드가 채널에서 읽기 및 쓰기 데이터를 할 때 데이터를 사용할 수없는 경우, 스레드는 다른 작업을 수행 할 수 있습니다 . 스레드는 보통 별도의 스레드가 입출력하는 다수의 채널을 관리 할 수 있도록, 다른 채널 IO 동작을 수행하기위한 IO의 유휴 시간을 비 차단. 따라서, NIO는 서버가 동시에 서버에 대한 모든 클라이언트 연결을 처리하기 위해 하나 또는 스레드의 수를 제한 사용할 수 있습니다

네트워크 통신을 이용하여 완성 NIO

차단 :

import org.junit.jupiter.api.Test;

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.Path;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;

public class BlockingNIOTest {
    @Test
    public void client() throws IOException {
        //获取通道
        SocketChannel sChannel=SocketChannel.open(new InetSocketAddress("127.0.0.1",9898));
        FileChannel inChannel=FileChannel.open(Paths.get("文件路径"),StandardOpenOption.READ);

        //分配指定大小的缓冲区
        ByteBuffer buf=ByteBuffer.allocate(1024);

        //读取本地文件,并发送到服务器
        while (inChannel.read(buf)!=-1){
            buf.flip();
            sChannel.write(buf);
            buf.clear();
        }

        //关闭通道
        sChannel.close();
        inChannel.close();
    }

    @Test
    public void server() throws IOException {
        //获取通道
        ServerSocketChannel ssChannel=ServerSocketChannel.open();
        FileChannel outChannel=FileChannel.open(Paths.get("文件路径"),StandardOpenOption.READ,StandardOpenOption.CREATE);

        //绑定9898端口连接
        ssChannel.bind(new InetSocketAddress(9898));
        //获取客户端连接的通道
        SocketChannel socketChannel=ssChannel.accept();
        //分配指定大小的缓冲区
        ByteBuffer buf=ByteBuffer.allocate(1024);
        //接收客户端的数据,并报错到本地
        while (socketChannel.read(buf)!=-1){
            buf.flip();
            outChannel.write(buf);
            buf.clear();
        }

        //关闭通道
        outChannel.close();
        ssChannel.close();
        socketChannel.close();
    }
}

 

게시 된 242 개 원래 기사 · 원 찬양 13 ·은 10000 +를 볼

추천

출처blog.csdn.net/qq_41813208/article/details/103839560