As you probably know, NIO offers many advantages—like speed and a large number of concurrent connections:
import java.io.*;
import java.net.*;
import java.nio.*;
import java.util.*;
import java.nio.channels.*;
import java.nio.charset.*;
public class ServerNIO{
public static void main(String[] args){
ServerSocketChannel serverNIO=null;
InetSocketAddress ISA=null;
Selector selector=null;
ByteBuffer clientBuf=null;
int port=5000;
try{
serverNIO=ServerSocketChannel.open();
serverNIO.configureBlocking(false);
}catch(IOException e)
{System.out.println(e.getMessage());}
try{
InetAddress addr=InetAddress.getByName("localhost");
ISA=new InetSocketAddress(addr,port);
}catch(UnknownHostException e)
{System.out.println(e.getMessage());}
try{
ServerSocket SS=serverNIO.socket();
SS.bind(ISA);
System.out.println("- Ready -");
}catch(IOException e)
{System.out.println(e.getMessage());}
try{
selector=Selector.open();
serverNIO.register(selector,SelectionKey.OP_ACCEPT);
}catch(IOException e)
{System.out.println(e.getMessage());}
while(true)
{try{
selector.select();
}catch(IOException e)
{System.out.println(e.getMessage());}
Set keys=selector.selectedKeys();
Iterator iter=keys.iterator();
while(iter.hasNext())
{
SelectionKey key=(SelectionKey)iter.next();
iter.remove();
if((key.isValid())&&(key.isAcceptable()))
{
try{
ServerSocketChannel SSC=(ServerSocketChannel)key.channel();
SocketChannel clientNIO=SSC.accept();
clientNIO.configureBlocking(false);
SelectionKey SK=clientNIO.register(
selector,SelectionKey.OP_READ | SelectionKey.OP_WRITE);
}catch(IOException e)
{System.out.println(e.getMessage());}
}
if((key.isValid())&&(key.isReadable()))
{
try{
SocketChannel clientNIO=(SocketChannel)key.channel();
clientBuf=ByteBuffer.allocateDirect(1024);
clientNIO.read(clientBuf);
}catch(IOException e)
{System.out.println(e.getMessage());
try{
key.channel().close();key.cancel();
}catch(IOException ex)
{System.out.println(e.getMessage());}}
clientBuf.flip();
Charset charset=Charset.forName("ISO-8859-1");
CharsetDecoder decoder = charset.newDecoder();
try{
CharBuffer charBuffer = decoder.decode(clientBuf);
System.out.println(charBuffer.toString());
clientBuf.clear();
}catch(IOException e)
{System.out.println(e.getMessage());}
}
if((key.isValid())&&(key.isWritable()))
{
SocketChannel clientNIO=(SocketChannel)key.channel();
ByteBuffer serverBuf=ByteBuffer.allocateDirect(1024);
try{
String s="Message from server ...";
serverBuf.put(s.getBytes());
serverBuf.flip();
clientNIO.write(serverBuf);
}catch(IOException e)
{System.out.println(e.getMessage());
try{
key.channel().close();key.cancel();
}catch(IOException ex)
{System.out.println(ex.getMessage());}}
}
}
}
}
}
No comments:
Post a Comment