views:

333

answers:

1

hi guys, I'm developing a multiple port reading application using nio package.Actually these ports recieve packets continously.Using nio package we have to reAD packets using channels.There should not be a packet loss.Here is my code.I've confusion in else if ((key.readyOps() & SelectionKey.OP_READ)== SelectionKey.OP_READ) block.Please suggest a feasible way to handle the buffer so that i can dmp the whole data into database without loss.

import java.io.*;
import java.net.*;
import java.nio.*;
import java.nio.channels.*;
import java.util.*;

public class MultiPortEcho
{
  private int ports[];
  private ByteBuffer echoBuffer = ByteBuffer.allocate(32000);

  public MultiPortEcho( int ports[] ) throws IOException
  {
    this.ports = ports;
    go();
  }

  private void go() throws IOException
  {
    // Create a new selector
    Selector selector = Selector.open();

    // Open a listener on each port, and register each one
    // with the selector
    for (int i=0; i<ports.length; ++i)
    {
      ServerSocketChannel ssc = ServerSocketChannel.open();
      ssc.configureBlocking( false );
      ServerSocket ss = ssc.socket();
      InetSocketAddress address = new InetSocketAddress( ports[i] );
      ss.bind( address );

      SelectionKey key = ssc.register( selector, SelectionKey.OP_ACCEPT );

      System.out.println( "Going to listen on "+ports[i] );
    }

    while (true)
    {
      int num = selector.select();
      System.out.println("num::::"+num);
      Set selectedKeys = selector.selectedKeys();
      Iterator it = selectedKeys.iterator();

      while (it.hasNext())
      {
        SelectionKey key = (SelectionKey)it.next();

        if ((key.readyOps() & SelectionKey.OP_ACCEPT)== SelectionKey.OP_ACCEPT)
          {
              // Accept the new connection
        ServerSocketChannel ssc = (ServerSocketChannel)key.channel();
        SocketChannel sc = ssc.accept();
        sc.configureBlocking( false );

        // Add the new connection to the selector
        SelectionKey newKey = sc.register(selector,SelectionKey.OP_READ);
        it.remove();

        System.out.println( "Got connection from "+sc );
        }
          else if ((key.readyOps() & SelectionKey.OP_READ)== SelectionKey.OP_READ)
          {
        // Read the data
        SocketChannel sc =(SocketChannel)key.channel();
        System.out.println("sc::::"+sc);
        // data to fetched from channel and dump into the datatbase
        int bytesEchoed = 0;
        //while(true)
        {
        echoBuffer.clear();
        int r = sc.read(echoBuffer);
        System.out.println("r:::" + r);
        /*int pos=echoBuffer.position();
        System.out.println("pos:::" +pos);*/
        if (r == -1)
        {
         //echoBuffer.flip();
         echoBuffer.rewind();
         byte[] array = new byte[100000];
         while (echoBuffer.hasRemaining())
         {
          int n = echoBuffer.remaining();
          System.out.println("size:" + n);
          echoBuffer.get(array,0,n );
          System.out.println(new String(array,0,n));
          key.cancel();
          it.remove();

         }

        }

        /*int pos=echoBuffer.position();
        System.out.println("pos:::" + pos);
        if(r<=0)
        {
         echoBuffer.flip();
         for (int j = 0; j < pos; j++ )
         {
          String ss =Integer.toHexString(echoBuffer.get());
          if (ss.length() == 1)
           System.out.print("0" + ss + " ");
          else if (ss.length() > 2)
           System.out.print(ss.substring(6) + " ");
          else System.out.print(ss + " ");
                        }
          break;
        }

        echoBuffer.flip();

        sc.write( echoBuffer );
        bytesEchoed += r;*/
              }

             //System.out.println( "Echoed "+bytesEchoed+" from "+sc );
             //it.remove();
        }

      }

//System.out.println( "going to clear" );
//      selectedKeys.clear();
//System.out.println( "cleared" );
    }
  }

  static public void main( String args[] ) throws Exception
  {
    FileOutputStream fileoutputstream = new FileOutputStream("MultiPort.txt", false);
    PrintStream printstream = new PrintStream(fileoutputstream);
    System.setOut(printstream);
    if (args.length<=0) {
      System.err.println( "Usage: java MultiPortEcho port [port port ...]" );
      System.exit( 1 );
    }

    int ports[] = new int[args.length];

    for (int i=0; i<args.length; ++i) {
      ports[i] = Integer.parseInt( args[i] );
    }

    new MultiPortEcho( ports );
  }
}
A: 

Isn't this a double post, I think I saw this question elsewhere?

Anyway, the first thing you need to do is to remove the key.cancel(), which is completely invalidating your key so that it will not appear in future selects.

Nuoji