欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java NIO Channel示例

程序员文章站 2022-04-24 14:25:36
...

Channel和传统IO中的流很类似,不同点在予:

1. Channel既可以从通道中读取数据,又可以写数据到通道。但流的读写通常是单向的。

2. 通道可以异步地读写。

3. 通道中的数据总是要先读到一个Buffer,或者总是要从一个Buffer中写入。

    Channel的实现类包括FileChannel、DatagramChannel、SocketChannel、ServerSocketChannel

FileChannel

从文件中读写数据。

DatagramChannel

通过UDP读写数据。

SocketChannel

通过TCP读写数据

ServerSocketChannel

监听新进来的TCP连接,像Web服务器那样。对每一个新进来的连接都会创建一个SocketChannel

Channel 示例

服务端

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import java.nio.Buffer;
import java.nio.ByteBuffer;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;

public class Server
{
    public static void main(String[] args) throws IOException
    {
        //用静态的open( )工厂方法创建一个ServerSocketChannel 对象
        ServerSocketChannel server = ServerSocketChannel.open();
        //通过socket()获取ServerSocket对象,实现socket绑定。
        server.socket().bind(new InetSocketAddress("127.0.0.1", 8000));
        SocketChannel ssl=  server.accept();
        //创建ByteBuffer并读取输出
        ByteBuffer buffer = ByteBuffer.allocate(500);
        ssl.read(buffer);
        buffer.flip();
        while (buffer.hasRemaining()) {
                System.out.print((char)buffer.get());
        }
        ssl.close();
        server.close();
    }
}

客户端:

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;

public class Client
{
    public static void main(String[] args) throws IOException
    {
        SocketChannel socketChannel = SocketChannel.open();
        //调用connect()方法建立连接,也可以直接调用Socket中的方法
        socketChannel.connect(new InetSocketAddress("127.0.0.1", 8000));

        ByteBuffer writeBuffer = ByteBuffer.allocate(128);
        writeBuffer.put("hello ".getBytes());

        writeBuffer.flip();
        socketChannel.write(writeBuffer);
        socketChannel.close();
    }
}