NIO 가 사용 하 는 간단 한 예

9015 단어 자바
1.FileChannel fileChannel 은 차단 되 어 있 습 니 다.비 차단 모드 에서 실행 할 수 없 기 때문에 Selector 에 등록 할 수 없습니다.간단 한 예 는 다음 과 같 습 니 다.
File f = new File("abcd");
        File f2 = new File("abcd2");
        try (RandomAccessFile accessFile = new RandomAccessFile(f, "r");
            RandomAccessFile accessFile2 = new RandomAccessFile(f2, "rw");
            FileChannel fileChannel = accessFile.getChannel();
            FileChannel fileChannel2 = accessFile2.getChannel();)
        {
            fileChannel2.position(fileChannel2.size());
            ByteBuffer buffer = ByteBuffer.allocate(128);
            while (fileChannel.read(buffer) > 0)
            {
                buffer.flip();
                while (buffer.hasRemaining())
                {
                    fileChannel2.write(buffer);
                }
                buffer.clear();
                System.out.println("------");
            }
        }

RandomAccessFile 에서 FileChannel 을 가 져 옵 니 다.ByteBuffer 를 통 해 FileChannel 에서 데 이 터 를 읽 을 수도 있 고 FileChannel 에 데 이 터 를 쓸 수도 있 습 니 다.데 이 터 를 쓸 때 while 순환 을 사용 해 야 합 니 다.ByteBuffer 가 한꺼번에 데 이 터 를 모두 기록 할 수 는 없 기 때 문 입 니 다.fileChannel.force(true)방법 은 메모리 데 이 터 를 디스크 에 강제로 동기 화 합 니 다.(boolean 매개 변 수 는 파일 메타 데 이 터 를 기록 할 지 여부(권한 정보 등)를 표시 합 니 다.ByteBuffer 읽 기와 쓰기 사이 에 호출 방법 이 필요 합 니 다.
2.Selector 를 사용 하면 차단 되 지 않 은 channel 만 selector 에 등록 할 수 있 기 때문에 차단 되 지 않 은 channel 을 사용 해 야 합 니 다.여기 서 socketChannel 과 socketServerChannel 을 사용 하여 시범 을 보 여 줍 니 다.예제 코드 는 다음 과 같 습 니 다.
클 라 이언 트 코드:
public class SocketNio
{

    private static Charset charset = Charset.forName("UTF-8");

    private static int IO_LENGTH = 20;

    private static int BUFFER_SIZE = 128;

    private static int PORT = 8090;

    public static void main(String[] args)
        throws IOException
    {
        SocketChannel channel = SocketChannel.open();
        channel.connect(new InetSocketAddress(PORT));
        ByteBuffer buffer = ByteBuffer.allocate(BUFFER_SIZE);
        @SuppressWarnings("resource")
        Scanner input = new Scanner(System.in);
        while (true)
        {
            String s = input.nextLine();
            buffer.clear();
            for (int i = 0; i < Math.ceil(s.length() / (double)IO_LENGTH); i++)
            {
                buffer.put(charset.encode(i * IO_LENGTH + IO_LENGTH > s.length() ? s.substring(i * IO_LENGTH)
                    : s.substring(i * IO_LENGTH, i * IO_LENGTH + IO_LENGTH)));
                buffer.flip();
                while (buffer.hasRemaining())
                {
                    channel.write(buffer);
                }
                buffer.clear();
            }
        }
    }
}

클 라 이언 트 는 데 이 터 를 보 내 는 기능 만 실현 했다.
서버 코드 는 다음 과 같 습 니 다.
public class SocketServerNIO
{

    private static Charset charset = Charset.forName("UTF-8");

    private static int PORT = 8090;

    private static int BUFFER_SIZE = 128;

    public static void main(String[] args)
        throws IOException
    {
        ServerSocketChannel channel = ServerSocketChannel.open();
        channel.bind(new InetSocketAddress(PORT));
        channel.configureBlocking(false);
        final Selector selector = Selector.open();
        channel.register(selector, SelectionKey.OP_ACCEPT);
        while (selector.select() > 0)
        {
            Set selectedKeys = selector.selectedKeys();
            Iterator keyIterator = selectedKeys.iterator();
            while (keyIterator.hasNext())
            {
                SelectionKey key = keyIterator.next();
                if (key.isAcceptable())
                {
                    SocketChannel sc = ((ServerSocketChannel)key.channel()).accept();
                    sc.configureBlocking(false);
                    sc.register(selector, SelectionKey.OP_READ);
                    //  sk   Channel           
                    key.interestOps(SelectionKey.OP_ACCEPT);
                }
                if (key.isReadable())
                {
                    //    SelectionKey   Channel
                    SocketChannel sc = (SocketChannel)key.channel();
                    ByteBuffer buff = ByteBuffer.allocate(BUFFER_SIZE);
                    String content = "";
                    try
                    {
                        while (sc.read(buff) > 0)
                        {
                            buff.flip();
                            content += charset.decode(buff);
                            buff.clear();
                        }
                        System.out.println("     :" + content);
                        key.interestOps(SelectionKey.OP_READ);
                    }
                    //       sk   Channel     ,    Channel   Client     ,
                    //    Selector   sk   
                    catch (IOException e)
                    {
                        keyIterator.remove();
                        key.cancel();
                        if (key.channel() != null)
                            key.channel().close();
                    }
                }
                keyIterator.remove();
            }
        }
    }
}

서버 는 socketServerChannel 을 모든 클 라 이언 트 와 연 결 된 socketChannel 을 selector 감청 에 추가 합 니 다.데이터 기록 이 있 는 것 을 감지 할 때마다 서버 는 기록 데 이 터 를 인쇄 합 니 다.등 록 된 채널 마다 비 차단 모드 로 설정 되 어 있 음 을 주의 하 십시오.

좋은 웹페이지 즐겨찾기