scatter : 是指可以将channel 中的数据 读取 ByteBuffer 数组中。
gather : 是指将ByteBuffer 数组 中的数据写入到channel 中
代码:
import io.netty.buffer.ByteBuf; import java.io.IOException; import java.net.InetSocketAddress; import java.net.ServerSocket; import java.nio.ByteBuffer; import java.nio.channels.ServerSocketChannel; import java.nio.channels.SocketChannel; /** * NIO scatter 与 gather 操作 */ public class ChannelTest1 { public static void main(String[] args) throws IOException { ServerSocketChannel serverSocketChannel = ServerSocketChannel.open(); ServerSocket serverSocket = serverSocketChannel.socket(); InetSocketAddress inetSocketAddress = new InetSocketAddress(8899); serverSocket.bind(inetSocketAddress); //阻塞并获取socketChannel SocketChannel socketChannel = serverSocketChannel.accept(); ByteBuffer [] byteBuffers = new ByteBuffer[3]; byteBuffers [0] = ByteBuffer.allocate(3); byteBuffers [1] = ByteBuffer.allocate(2); byteBuffers [2] = ByteBuffer.allocate(4); int length = 3+2+4; while (true) { int readLength = 0; // scattering read while (readLength<length) { readLength += socketChannel.read(byteBuffers); System.out.println("read length :" + readLength); for (ByteBuffer byteBuffer : byteBuffers) { System.out.println("read position : "+byteBuffer.position()+", limit : " + byteBuffer.limit()); } } //翻转 for(ByteBuffer b : byteBuffers) { b.flip(); } //回写响应信息 int writeLength = 0; while (writeLength < length) { writeLength += socketChannel.write(byteBuffers); System.out.println("write length :" + writeLength); } // 清空byteBuffer for(ByteBuffer b : byteBuffers) { b.clear(); } } } }