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