finding query when reading blocking socketChannel

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

finding query when reading blocking socketChannel

Sebastien Dionne
I have a question.  I'm trying to read a SocketChannel for the first time, and I want to validate if I'm doing the reading part correctly.  Any comments are welcome.

I want to read the socket into a buffer(10) (it's for debugging purpose) and loop until a find the string [eoq] or when the max buffer length is 50.  If the string is not found, I copy the line into a buffer and continue to read.

My socket is blocking.  I want to create a sample with blocking and after that non-blocking.  (just to be able to understand how it works)




    protected SocketChannel f_socketChannel;
    protected int limitBB = 50;
    protected CharsetDecoder asciiDecoder = Charset.forName("ISO-8859-1").newDecoder();
    protected ByteBuffer cumulatifBB = ByteBuffer.allocate(10);
    protected ByteBuffer buf = ByteBuffer.allocateDirect(10);

    public String getQuery(ByteBuffer buf) throws IOException {
       
        while(f_socketChannel.isOpen()){
            // Clear the buffer and read bytes from socket
            buf.clear();
           
            int numBytesRead = f_socketChannel.read(buf);
       
            if (numBytesRead == -1) {
                // No more bytes can be read from the channel
                close();
            } else {
                // To read the bytes, flip the buffer
                buf.flip();
       
                if(buf.hasRemaining()){
                   
                    // faut trouver le pattern [eoq].
                    System.out.println("Remaining=" + buf.remaining());
                   
                    // on remplit le BB cumulatifBB avec le BB buf
                    cumulatifBB = getBB(cumulatifBB, buf);
                   
                    // On lit le buffer cumulatif pour voir si on trouverait la EOQ
                    ByteBuffer tmp = cumulatifBB.duplicate();
                    tmp.flip();
                   
                    // on decode le buffer pour voir si nous avons recu le EOQ
                    String msg = asciiDecoder.decode(tmp).toString();
                   
                    System.out.println("msg=" + msg);
                   
                    int index = msg.indexOf("[eoq]");
                    if(index>-1){
                       
                        String query = msg.substring(0,index);
                        System.out.println("Query = " + query);
                       
                        // FAUT CONSERVER CE QUI VIENT APRES LE EOQ
                        // on vide le buffer
                        cumulatifBB.clear();
                        cumulatifBB.put(msg.substring(index + "[eoq]".length()).getBytes());

                        return query;
                       
                    } else {
                        System.out.println("pas de EOQ dans cette iteration");
                    }
                }
               
                // DEBUG
                System.out.println(getName() + " is SLEEPING...");
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
           
        }
       
        // nous avons un probleme
        return null;
    }
   
    public ByteBuffer getBB(ByteBuffer cumulatifBB, ByteBuffer buf){
        // on valide que le buffer n'explosera pas
        if(cumulatifBB.position() + buf.remaining()>=cumulatifBB.capacity()){
            // on regarde si nous n'avons pas la valeur maximale pour le buffer
            if(cumulatifBB.capacity() + buf.remaining()<limitBB){
               
                ByteBuffer bb = ByteBuffer.allocate(cumulatifBB.capacity() + buf.capacity());
                cumulatifBB.flip();
                bb.put(cumulatifBB);
                cumulatifBB = bb;
               
            } else {
                // on avons atteind le maximum, donc on ferme la connection
                System.out.println("BUFFER MAX ATTEIND.. LE CLIENT ENVOYE DE LA JUNK OU LE BUFFER EST TROP PETIT!");
               
            }
        }
       
        cumulatifBB = cumulatifBB.put(buf);
       
        return cumulatifBB;
    }

public void run() {
       
        while(f_socketChannel.isOpen()){
           
            try {
                String query = getQuery(buf);
               
                System.out.println("QUERY RETURNED = " + query);
                if(query!=null){
                    //processQuery(query);  all the work will be done here.
                }
               
            } catch (IOException e) {
                // Connection may have been closed
                e.printStackTrace();
                // CLOSE
            }
        }
       
        System.out.println("QUIT LE CLIENT CONNECTION HANDLER");
       
    }
Reply | Threaded
Open this post in threaded view
|

Re: finding query when reading blocking socketChannel

Oleksiy Stashok
Hello,

your sample looks fine.
Just for your concrete usecase, IMHO, it's better to use just single  
buffer, which will reduce number of copy operations and make impl.  
faster.

Thanks.

WBR,
Alexey.

On Mar 24, 2008, at 13:10 , Survivant 00 wrote:

> I have a question.  I'm trying to read a SocketChannel for the first  
> time, and I want to validate if I'm doing the reading part  
> correctly.  Any comments are welcome.
>
> I want to read the socket into a buffer(10) (it's for debugging  
> purpose) and loop until a find the string [eoq] or when the max  
> buffer length is 50.  If the string is not found, I copy the line  
> into a buffer and continue to read.
>
> My socket is blocking.  I want to create a sample with blocking and  
> after that non-blocking.  (just to be able to understand how it works)
>
>
>
>
>     protected SocketChannel f_socketChannel;
>     protected int limitBB = 50;
>     protected CharsetDecoder asciiDecoder =  
> Charset.forName("ISO-8859-1").newDecoder();
>     protected ByteBuffer cumulatifBB = ByteBuffer.allocate(10);
>     protected ByteBuffer buf = ByteBuffer.allocateDirect(10);
>
>     public String getQuery(ByteBuffer buf) throws IOException {
>
>         while(f_socketChannel.isOpen()){
>             // Clear the buffer and read bytes from socket
>             buf.clear();
>
>             int numBytesRead = f_socketChannel.read(buf);
>
>             if (numBytesRead == -1) {
>                 // No more bytes can be read from the channel
>                 close();
>             } else {
>                 // To read the bytes, flip the buffer
>                 buf.flip();
>
>                 if(buf.hasRemaining()){
>
>                     // faut trouver le pattern [eoq].
>                     System.out.println("Remaining=" +  
> buf.remaining());
>
>                     // on remplit le BB cumulatifBB avec le BB buf
>                     cumulatifBB = getBB(cumulatifBB, buf);
>
>                     // On lit le buffer cumulatif pour voir si on  
> trouverait la EOQ
>                     ByteBuffer tmp = cumulatifBB.duplicate();
>                     tmp.flip();
>
>                     // on decode le buffer pour voir si nous avons  
> recu le EOQ
>                     String msg = asciiDecoder.decode(tmp).toString();
>
>                     System.out.println("msg=" + msg);
>
>                     int index = msg.indexOf("[eoq]");
>                     if(index>-1){
>
>                         String query = msg.substring(0,index);
>                         System.out.println("Query = " + query);
>
>                         // FAUT CONSERVER CE QUI VIENT APRES LE EOQ
>                         // on vide le buffer
>                         cumulatifBB.clear();
>                         cumulatifBB.put(msg.substring(index +  
> "[eoq]".length()).getBytes());
>
>                         return query;
>
>                     } else {
>                         System.out.println("pas de EOQ dans cette  
> iteration");
>                     }
>                 }
>
>                 // DEBUG
>                 System.out.println(getName() + " is SLEEPING...");
>                 try {
>                     Thread.sleep(2000);
>                 } catch (InterruptedException e) {
>                     // TODO Auto-generated catch block
>                     e.printStackTrace();
>                 }
>             }
>
>         }
>
>         // nous avons un probleme
>         return null;
>     }
>
>     public ByteBuffer getBB(ByteBuffer cumulatifBB, ByteBuffer buf){
>         // on valide que le buffer n'explosera pas
>         if(cumulatifBB.position() +  
> buf.remaining()>=cumulatifBB.capacity()){
>             // on regarde si nous n'avons pas la valeur maximale  
> pour le buffer
>             if(cumulatifBB.capacity() + buf.remaining()<limitBB){
>
>                 ByteBuffer bb =  
> ByteBuffer.allocate(cumulatifBB.capacity() + buf.capacity());
>                 cumulatifBB.flip();
>                 bb.put(cumulatifBB);
>                 cumulatifBB = bb;
>
>             } else {
>                 // on avons atteind le maximum, donc on ferme la  
> connection
>                 System.out.println("BUFFER MAX ATTEIND.. LE CLIENT  
> ENVOYE DE LA JUNK OU LE BUFFER EST TROP PETIT!");
>
>             }
>         }
>
>         cumulatifBB = cumulatifBB.put(buf);
>
>         return cumulatifBB;
>     }
>
> public void run() {
>
>         while(f_socketChannel.isOpen()){
>
>             try {
>                 String query = getQuery(buf);
>
>                 System.out.println("QUERY RETURNED = " + query);
>                 if(query!=null){
>                     //processQuery(query);  all the work will be  
> done here.
>                 }
>
>             } catch (IOException e) {
>                 // Connection may have been closed
>                 e.printStackTrace();
>                 // CLOSE
>             }
>         }
>
>         System.out.println("QUIT LE CLIENT CONNECTION HANDLER");
>
>     }


---------------------------------------------------------------------
To unsubscribe, e-mail: [hidden email]
For additional commands, e-mail: [hidden email]