package com.ibm.jnio;
import java.io.*;
import java.net.*;
import java.nio.*;
import java.nio.channels.*;
public class UseScatterGather
{
static private final int firstHeaderLength = 2;
static private final int secondHeaderLength = 4;
static private final int bodyLength = 6;
static public void main( String args[] ) throws Exception {
if (args.length!=1) {
System.err.println( "Usage: java UseScatterGather port" );
System.exit( 1 );
}
int port = Integer.parseInt( args[0] );
ServerSocketChannel ssc = ServerSocketChannel.open();
InetSocketAddress address = new InetSocketAddress( port );
ssc.socket().bind( address );
int messageLength =
firstHeaderLength + secondHeaderLength + bodyLength;
ByteBuffer buffers[] = new ByteBuffer[3];
buffers[0] = ByteBuffer.allocate( firstHeaderLength );
buffers[1] = ByteBuffer.allocate( secondHeaderLength );
buffers[2] = ByteBuffer.allocate( bodyLength );
SocketChannel sc = ssc.accept();
while (true) {
// Scatter-read into buffers
int bytesRead = 0;
while (bytesRead < messageLength) {
long r = sc.read( buffers );
bytesRead += r;
System.out.println( "r "+r );
for (int i=0; i<buffers.length; ++i) {
ByteBuffer bb = buffers[i];
System.out.println( "b "+i+" "+bb.position()+" "+bb.limit() );
}
}
// Process message here
// Flip buffers
for (int i=0; i<buffers.length; ++i) {
ByteBuffer bb = buffers[i];
bb.flip();
}
// Scatter-write back out
long bytesWritten = 0;
while (bytesWritten<messageLength) {
long r = sc.write( buffers );
bytesWritten += r;
}
// Clear buffers
for (int i=0; i<buffers.length; ++i) {
ByteBuffer bb = buffers[i];
bb.clear();
}
System.out.println( bytesRead+" "+bytesWritten+" "+messageLength );
}
}
}