Java NIO Channel示例

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();
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值