Help coderanch get a
new server
by contributing to the fundraiser
  • Post Reply Bookmark Topic Watch Topic
  • New Topic
programming forums Java Mobile Certification Databases Caching Books Engineering Micro Controllers OS Languages Paradigms IDEs Build Tools Frameworks Application Servers Open Source This Site Careers Other Pie Elite all forums
this forum made possible by our volunteer staff, including ...
Marshals:
  • Campbell Ritchie
  • Jeanne Boyarsky
  • Ron McLeod
  • Paul Clapham
  • Liutauras Vilda
Sheriffs:
  • paul wheaton
  • Rob Spoor
  • Devaka Cooray
Saloon Keepers:
  • Stephan van Hulst
  • Tim Holloway
  • Carey Brown
  • Frits Walraven
  • Tim Moores
Bartenders:
  • Mikalai Zaikin

selector.select() problem

 
Greenhorn
Posts: 6
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
Hello all,
i am getting problem in my chat server. It starts smooth but after some time
int numKeys=selector.select();
numKeys value always arrives 0 causes loop to traverse infinitely. Can anyone please help me to figure it out. Thanks in advance.
Here is my code.

public void run() {

//Adnan 6-8-2003
StringBuffer stringBuffer = null;
ByteBuffer byteBuffer= null;
try {//try0
serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.configureBlocking(false); //Non Blocking mode
serverSocket = serverSocketChannel.socket();
InetSocketAddress isa = new InetSocketAddress(serverport);
serverSocket.bind(isa);
selector = Selector.open();
serverSocketChannel.register(selector,SelectionKey.OP_ACCEPT);

byteBuffer = ByteBuffer.allocate(4096);

while(!shutdown){
//Auth Server will live until user stops it

try{
int numKeys=selector.select();
//after some time this value always arrives 0
System.out.println("numKeys= "+numKeys);
if(numKeys==0)
continue;

if(numKeys >0)
{ //if1
Set skeys = selector.selectedKeys();//get Selection set related to this event.
Iterator iterator=skeys.iterator();

if(iterator!=null)
while(iterator.hasNext()) { //while1
iterationsCount++;
SelectionKey selectionKey = (SelectionKey)iterator.next();
iterator.remove();
try{ //trywhile1
int rskOps = selectionKey.readyOps();//Get the type of operation
if ((rskOps & SelectionKey.OP_ACCEPT) == SelectionKey.OP_ACCEPT) {

Socket socket=serverSocket.accept();
isocket=socket;//for check only
SocketChannel socketChannel = socket.getChannel();
socketChannel.configureBlocking(false);
socketChannel.register(selector,SelectionKey.OP_READ);
}
else
if ((rskOps & SelectionKey.OP_READ) == SelectionKey.OP_READ){
SocketChannel socketChannel = (SocketChannel)selectionKey.channel();
try {
if ( socketChannel == null)
throw new AssertionError("Couldn't get the socket Channel");
byteBuffer.clear();

count = socketChannel.read(byteBuffer);

if(stringBuffer==null)
stringBuffer = new StringBuffer(1);
byteBuffer.flip();
//my utility mrthod for conversion
protocolUtil.appendByteBufferToStringBuffer(byteBuffer,stringBuffer);
byteBuffer.clear();

}catch (Exception ex) {
socketChannel.close();
socketClose(selectionKey,socketChannel.socket()) ;
}
if (byteBuffer.limit() == 0 || (count ==-1) )
{
socketChannel.close();
socketClose(selectionKey,socketChannel.socket());
break;
}
else{

if(stringBuffer!=null && stringBuffer.toString().length()>0)
processRequest(stringBuffer.toString());
}
}
//cleanup
if(stringBuffer!=null){
stringBuffer.delete(0,stringBuffer.length());
stringBuffer = null;
}
}catch(Exception e){//end trywhile1
System.out.println("Auth Server, Exception end trywhile1");
e.printStackTrace();
((SocketChannel)selectionKey.channel()).close();
socketClose(selectionKey, ((SocketChannel)selectionKey.channel()).socket() );
}
} //end while1
} //end if1
}//end try1
catch(Exception ee)
{
ee.printStackTrace();
}
} //end while0 shutdown
}//end try0
catch(Exception ex){

ex.printStackTrace();
}
finally{
//cleanup
if(stringBuffer!=null)
stringBuffer.delete(0,stringBuffer.length() );
byteBuffer = null;
stringBuffer = null;
}

}

private void socketClose(SelectionKey sk,Socket socket) {
try {
synchronized (sk) {
sk.cancel();
}
socket.close();
socket=null;
}catch (Exception ex) {
}
catch(Throwable t) {
}
}
 
Ranch Hand
Posts: 473
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
i hope that you got your solution by now...

Maki Jav
 
A tiny monkey bit me and I got tiny ads:
We need your help - Coderanch server fundraiser
https://coderanch.com/t/782867/Coderanch-server-fundraiser
reply
    Bookmark Topic Watch Topic
  • New Topic