You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tomcat.apache.org by Peter Warren <pe...@nomad.org> on 2007/06/04 20:08:09 UTC

Re: comet read event

Hi Filip,

Somehow I missed your response a while back.  Below are two test clients
and one comet servlet.  One client works, and the other doesn't.  I
found out the failing client doesn't work because HttpURLConnection
doesn't seem to allow writing to the output stream after the input
stream has been requested (or at least I haven't figured out how to
allow it).  On the other hand, Filip cautioned me against using the
client that works because it re-sends http headers with each request,
which could potentially get received as data by the comet servlet. 

So... is there a way for me to use a single HttpURLConnection and be
able to read and write multiple times on its input and output streams? 
I tried setting Transfer-Encoding to chunked, but couldn't get it to
make a difference.  I'd like to use HttpURLConnection instead of raw
sockets to avoid having to manually handle the headers, redirects,
proxies, etc.  I realize this question is more java api specific than
tomcat comet specific, but since many comet users might like to use
HttpURLConnection, I thought it was still relevant here.

Thanks for any help,
Peter

### CometTestClient1.java - this test hangs since 2nd output on
HttpURLConnection doesn't get sent ###

import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;

public class CometTestClient1 {

    private HttpURLConnection urlConn;

    private PrintWriter out;

    private URL url = new URL("http://127.0.0.1/CometTest");

    public static void main(String[] args) throws Exception {
        CometTestClient1 test = new CometTestClient1();
        test.test();
    }

    public CometTestClient1() throws IOException {
        initConnection();
    }

    private void initConnection() throws IOException {
        urlConn = (HttpURLConnection) url.openConnection();
        urlConn.setDoInput(true);
        urlConn.setDoOutput(true);
        urlConn.connect();
        out = new PrintWriter(urlConn.getOutputStream());
    }

    public void test() throws IOException {
        out.println("test 1");
        out.flush();

        String line = read(urlConn.getInputStream());
        System.out.println(line);

        // next line never gets sent out -- presumably because the url
connection
        // doesn't allow output after getInputStream has been called
        out.println("test 2");
        out.flush();

        line = read(urlConn.getInputStream());
        System.out.println(line);

        out.close();
        urlConn.disconnect();
    }

    private String read(InputStream is) throws IOException {
        StringBuffer inputBuffer = new StringBuffer();
        byte[] buf = new byte[512];
        do {
            int n = is.read(buf); // can throw an IOException
            if (n > 0) {
                inputBuffer.append(new String(buf, 0, n));
            } else if (n < 0) {
                return ("read error");
            }
        } while (is.available() > 0);
        return inputBuffer.toString();
    }
}

### CometTestClient2.java - works but sends new http headers for each
client output ###

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.URL;

public class CometTestClient2 {

    private HttpURLConnection urlConn;

    private PrintWriter out;

    private URL url = new URL("http://127.0.0.1/CometTest");

    public static void main(String[] args) throws Exception {
        CometTestClient2 test = new CometTestClient2();
        test.test();
    }

    public CometTestClient2() throws IOException {
        initConnection();
    }

    private void initConnection() throws IOException {
        urlConn = (HttpURLConnection) url.openConnection();
        urlConn.setDoInput(true);
        urlConn.setDoOutput(true);
        urlConn.connect();
        out = new PrintWriter(urlConn.getOutputStream());
    }

    public void test() throws IOException {
        out.println("test 1");
        out.flush();

        BufferedReader in = new BufferedReader(new
InputStreamReader(urlConn.getInputStream()));

        String line = in.readLine();
        System.out.println(line);

        initConnection();
        out.println("test 2");
        out.flush();

        in = new BufferedReader(new
InputStreamReader(urlConn.getInputStream()));

        line = in.readLine();
        System.out.println(line);

        out.close();
        urlConn.disconnect();
    }
}

### CometTestServlet ###

import java.io.IOException;
import java.io.InputStream;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.catalina.CometEvent;
import org.apache.catalina.CometProcessor;

public class CometTestServlet extends HttpServlet implements
CometProcessor {
    private static final long serialVersionUID = 5472498184127924791L;

    public void event(CometEvent cometEvent) throws IOException,
ServletException {
        HttpServletRequest request = cometEvent.getHttpServletRequest();
        HttpServletResponse response = cometEvent.getHttpServletResponse();
        // don't want timeout events
        cometEvent.setTimeout(1000000);
        if (cometEvent.getEventType() == CometEvent.EventType.BEGIN) {
            log("Begin for session: " + request.getSession(true).getId());
            respond(request, response);
        } else if (cometEvent.getEventType() ==
CometEvent.EventType.ERROR) {
            log("Error for session: " + request.getSession(true).getId()
+ ", " + cometEvent.getEventSubType());
            cometEvent.close();
        } else if (cometEvent.getEventType() == CometEvent.EventType.END) {
            log("End for session: " + request.getSession(true).getId());
            cometEvent.close();
        } else if (cometEvent.getEventType() == CometEvent.EventType.READ) {
            log("Read for session: " + request.getSession(true).getId());
            respond(request, response);
        }
    }

    private void respond(HttpServletRequest request, HttpServletResponse
response) throws IOException {
        String clientMessage = read(request);
        if (clientMessage != null && clientMessage.length() > 0) {
            response.getWriter().println(clientMessage);
            response.getWriter().flush();
        }
    }

    private String read(HttpServletRequest request) throws IOException {
        InputStream is = request.getInputStream();
        StringBuffer inputBuffer = new StringBuffer();
        byte[] buf = new byte[512];
        do {
            int n = is.read(buf); // can throw an IOException
            if (n > 0) {
                inputBuffer.append(new String(buf, 0, n));
                log("Read " + n + " bytes: " + new String(buf, 0, n) + "
for session: "
                        + request.getSession(true).getId());
            } else if (n < 0) {
                log("comet read error");
            }
        } while (is.available() > 0);
        return inputBuffer.toString();
    }
}

Filip Hanik - Dev Lists wrote:
> why don't you make your test available, I'll run it through
>
> Filip
>
> Peter Warren wrote:
>> Yes, I'm using the NIO connector.  Here is the config line from my
>> server.xml:
>>
>>     <Connector port="80"
>> protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="150"
>> connectionTimeout="20000" keepAliveTimeout="120000"
>> maxKeepAliveRequests="-1" acceptorThreadCount="2" redirectPort="8443" />
>>
>> Are there any other configuration options I need to set?
>>
>> Peter
>>
>> Filip Hanik - Dev Lists wrote:
>>  
>>> and you are using the APR or the NIO connector right?
>>>
>>> Filip
>>>
>>> Peter Warren wrote:
>>>    
>>>> Thanks for the suggestion.  I changed the comet test servlet to read
>>>> directly from the input stream as shown in the advanced io
>>>> example.  I'm
>>>> still seeing the same behavior.  No comet read event gets generated on
>>>> the server, only the begin event which contains the client's first
>>>> message.  The client then sends its second message and blocks waiting
>>>> for the server.  No events are generated on the server in response to
>>>> the client's second message.  Any other tips for me?
>>>>
>>>> Thanks,
>>>> Peter
>>>>
>>>> from the CometTestServlet:
>>>>
>>>>     public void event(CometEvent cometEvent) throws IOException,
>>>> ServletException {
>>>>     ...
>>>>         if (cometEvent.getEventType() == CometEvent.EventType.BEGIN) {
>>>>             log("Begin for session: " +
>>>> request.getSession(true).getId());
>>>>             String clientMessage = read(request);
>>>>             if (clientMessage != null && clientMessage.length() > 0) {
>>>>                 response.getWriter().println(clientMessage);
>>>>                 response.getWriter().flush();
>>>>             }
>>>>         }
>>>>     ...
>>>>
>>>>     private String read(HttpServletRequest request) throws
>>>> IOException {
>>>>         InputStream is = request.getInputStream();
>>>>         StringBuffer inputBuffer = new StringBuffer();
>>>>         byte[] buf = new byte[512];
>>>>         do {
>>>>             int n = is.read(buf); // can throw an IOException
>>>>             if (n > 0) {
>>>>                 inputBuffer.append(new String(buf, 0, n));
>>>>                 log("Read " + n + " bytes: " + new String(buf, 0,
>>>> n) + "
>>>> for session: "
>>>>                         + request.getSession(true).getId());
>>>>             } else if (n < 0) {
>>>>                 log("comet read error");
>>>>             }
>>>>         } while (is.available() > 0);
>>>>         return inputBuffer.toString();
>>>>     }
>>>>
>>>> from the CometTestClient:
>>>>
>>>>     public void test() throws IOException {
>>>>         out.println("test 1");
>>>>         out.flush();
>>>>
>>>>         String line = read(urlConn.getInputStream());
>>>>         System.out.println(line);
>>>>
>>>>         out.println("test 2");
>>>>         out.flush();
>>>>
>>>>         line = read(urlConn.getInputStream());
>>>>         System.out.println(line);
>>>>
>>>>         out.close();
>>>>         urlConn.disconnect();
>>>>     }
>>>>
>>>>     private String read(InputStream is) throws IOException {
>>>>         StringBuffer inputBuffer = new StringBuffer();
>>>>         byte[] buf = new byte[512];
>>>>         do {
>>>>             int n = is.read(buf); // can throw an IOException
>>>>             if (n > 0) {
>>>>                 inputBuffer.append(new String(buf, 0, n));
>>>>             } else if (n < 0) {
>>>>                 return ("read error");
>>>>             }
>>>>         } while (is.available() > 0);
>>>>         return inputBuffer.toString();
>>>>     }
>>>>
>>>> Filip Hanik - Dev Lists wrote:
>>>>  
>>>>      
>>>>> take a look at the documentation, the way you are reading it is
>>>>> incorrect.
>>>>> you need to take advantage of the available() method
>>>>>
>>>>> Filip
>>>>>
>>>>> Peter Warren wrote:
>>>>>           
>>>>>> My BEGIN block in my comet servlet now looks like the code below
>>>>>> (added
>>>>>> a while loop to read until the buffer is empty).  Is that what
>>>>>> you had
>>>>>> in mind?  The buffer in the BEGIN event only contains the client's
>>>>>> first
>>>>>> message.  Am I not emptying the buffer correctly?  Although, I
>>>>>> wouldn't
>>>>>> expect the buffer to contain the client's second message since the
>>>>>> client blocks for an ack from the server before sending its second
>>>>>> message.  Any other thoughts on what happens to the client's second
>>>>>> message and why no READ event is generated?
>>>>>>
>>>>>> Thanks for your help,
>>>>>> Peter
>>>>>>
>>>>>>         if (cometEvent.getEventType() ==
>>>>>> CometEvent.EventType.BEGIN) {
>>>>>>             log("Begin for session: " +
>>>>>> request.getSession(true).getId());
>>>>>>             BufferedReader reader =
>>>>>> cometEvent.getHttpServletRequest().getReader();
>>>>>>             String line = null;
>>>>>>             while ((line = reader.readLine()) != null) {
>>>>>>                 log("servlet received: " + line);
>>>>>>             
>>>>>> cometEvent.getHttpServletResponse().getWriter().println("servlet
>>>>>> received: " + line);
>>>>>>               
>>>>>> cometEvent.getHttpServletResponse().getWriter().flush();
>>>>>>             }
>>>>>>         }
>>>>>>
>>>>>>  
>>>>>>               
>>>>>>> Filip Hanik wrote:
>>>>>>>
>>>>>>> it could be because the data from the request already came in with
>>>>>>> the
>>>>>>>                         
>>>>>> request.
>>>>>>  
>>>>>>               
>>>>>>> when the BEGIN happens, perform the actions as if there was a
>>>>>>> READ as
>>>>>>>                         
>>>>>> well, ie, empty out the buffer.
>>>>>>  
>>>>>>               
>>>>>>> Filip
>>>>>>>                         
>>>>>> Peter Warren wrote:
>>>>>>  
>>>>>>               
>>>>>>> The following client code generates a comet BEGIN event on the
>>>>>>> server
>>>>>>> but not a subsequent READ event, as I was expecting.  How come?
>>>>>>> Is my
>>>>>>> code wrong?  Are my expectations wrong?  See sequence of events
>>>>>>> commented in code below.
>>>>>>>
>>>>>>>     // client test method that sends messages to server and
>>>>>>> listens for
>>>>>>> responses
>>>>>>>     public void test() throws IOException {
>>>>>>>         out.println("test 1");
>>>>>>>         out.flush();
>>>>>>>
>>>>>>>         // server receives client's message, generates a BEGIN
>>>>>>> event,
>>>>>>> and sends response to client
>>>>>>>
>>>>>>>         in = new BufferedReader(new
>>>>>>> InputStreamReader(urlConn.getInputStream()));
>>>>>>>         System.out.println(in.readLine());
>>>>>>>
>>>>>>>         // client receives server's response and prints it
>>>>>>>
>>>>>>>         out.println("test 2");
>>>>>>>         out.flush();
>>>>>>>
>>>>>>>         System.out.println(in.readLine());
>>>>>>>
>>>>>>>         // client code blocks here waiting for server response.
>>>>>>>         // server never generates a READ event.  How come?
>>>>>>>         // Does the HttpURLConnection (see full code below) need
>>>>>>> to be
>>>>>>> set up differently?
>>>>>>>         // Am I using the PrintWriter incorrectly when sending
>>>>>>> to the
>>>>>>> comet servlet?
>>>>>>>
>>>>>>>         out.close();
>>>>>>>         urlConn.disconnect();
>>>>>>>     }
>>>>>>>
>>>>>>> Thanks for any help,
>>>>>>> Peter
>>>>>>>
>>>>>>> -- system --
>>>>>>>
>>>>>>> using:
>>>>>>> tomcat 6.0.13 on windows xp sp 2
>>>>>>> java 1.6.0_01
>>>>>>>
>>>>>>> -- test client & comet servlet source below --
>>>>>>>
>>>>>>> ## begin test client ##
>>>>>>>
>>>>>>> import java.io.BufferedReader;
>>>>>>> import java.io.IOException;
>>>>>>> import java.io.InputStreamReader;
>>>>>>> import java.io.PrintWriter;
>>>>>>> import java.net.HttpURLConnection;
>>>>>>> import java.net.URL;
>>>>>>>
>>>>>>> public class CometTestClient {
>>>>>>>
>>>>>>>     private HttpURLConnection urlConn;
>>>>>>>
>>>>>>>     private PrintWriter out;
>>>>>>>
>>>>>>>     private BufferedReader in;
>>>>>>>
>>>>>>>     public static void main(String[] args) throws Exception {
>>>>>>>         CometTestClient test = new CometTestClient();
>>>>>>>         test.test();
>>>>>>>     }
>>>>>>>
>>>>>>>     public CometTestClient() throws IOException {
>>>>>>>         initConnection();
>>>>>>>     }
>>>>>>>
>>>>>>>     private void initConnection() throws IOException {
>>>>>>>         URL url = new URL("http://127.0.0.1/CometTest");
>>>>>>>         urlConn = (HttpURLConnection) url.openConnection();
>>>>>>>         urlConn.setDoInput(true);
>>>>>>>         urlConn.setDoOutput(true);
>>>>>>>         urlConn.connect();
>>>>>>>         out = new PrintWriter(urlConn.getOutputStream());
>>>>>>>     }
>>>>>>>
>>>>>>>     public void test() throws IOException {
>>>>>>>         out.println("test 1");
>>>>>>>         out.flush();
>>>>>>>
>>>>>>>         in = new BufferedReader(new
>>>>>>> InputStreamReader(urlConn.getInputStream()));
>>>>>>>         System.out.println(in.readLine());
>>>>>>>
>>>>>>>         out.println("test 2");
>>>>>>>         out.flush();
>>>>>>>
>>>>>>>         System.out.println(in.readLine());
>>>>>>>
>>>>>>>         out.close();
>>>>>>>         urlConn.disconnect();
>>>>>>>     }
>>>>>>> }
>>>>>>>
>>>>>>> ## end test client ##
>>>>>>>
>>>>>>> ## begin comet servlet ##
>>>>>>>
>>>>>>> import java.io.BufferedReader;
>>>>>>> import java.io.IOException;
>>>>>>>
>>>>>>> import javax.servlet.ServletException;
>>>>>>> import javax.servlet.http.HttpServlet;
>>>>>>> import javax.servlet.http.HttpServletRequest;
>>>>>>>
>>>>>>> import org.apache.catalina.CometEvent;
>>>>>>> import org.apache.catalina.CometProcessor;
>>>>>>>
>>>>>>> public class CometTestServlet extends HttpServlet implements
>>>>>>> CometProcessor {
>>>>>>>     private static final long serialVersionUID =
>>>>>>> 5472498184127924791L;
>>>>>>>
>>>>>>>     public void event(CometEvent cometEvent) throws IOException,
>>>>>>> ServletException {
>>>>>>>         HttpServletRequest request =
>>>>>>> cometEvent.getHttpServletRequest();
>>>>>>>         // don't want timeout events
>>>>>>>         cometEvent.setTimeout(1000000);
>>>>>>>         if (cometEvent.getEventType() ==
>>>>>>> CometEvent.EventType.BEGIN) {
>>>>>>>             log("Begin for session: " +
>>>>>>> request.getSession(true).getId());
>>>>>>>             BufferedReader reader =
>>>>>>> cometEvent.getHttpServletRequest().getReader();
>>>>>>>             String line = reader.readLine();
>>>>>>>             if (line != null) {
>>>>>>>                 log("servlet received: " + line);
>>>>>>>            
>>>>>>> cometEvent.getHttpServletResponse().getWriter().println("servlet
>>>>>>> received: " + line);
>>>>>>>              
>>>>>>> cometEvent.getHttpServletResponse().getWriter().flush();
>>>>>>>             } else {
>>>>>>>                 cometEvent.close();
>>>>>>>             }
>>>>>>>         } else if (cometEvent.getEventType() ==
>>>>>>> CometEvent.EventType.ERROR) {
>>>>>>>             log("Error for session: " +
>>>>>>> request.getSession(true).getId()
>>>>>>> + ", " + cometEvent.getEventSubType());
>>>>>>>             cometEvent.close();
>>>>>>>         } else if (cometEvent.getEventType() ==
>>>>>>> CometEvent.EventType.END) {
>>>>>>>             log("End for session: " +
>>>>>>> request.getSession(true).getId());
>>>>>>>             cometEvent.close();
>>>>>>>         } else if (cometEvent.getEventType() ==
>>>>>>> CometEvent.EventType.READ) {
>>>>>>>             log("Read for session: " +
>>>>>>> request.getSession(true).getId());
>>>>>>>             BufferedReader reader =
>>>>>>> cometEvent.getHttpServletRequest().getReader();
>>>>>>>             String line = reader.readLine();
>>>>>>>             if (line != null) {
>>>>>>>            
>>>>>>> cometEvent.getHttpServletResponse().getWriter().println("servlet
>>>>>>> received: " + line);
>>>>>>>             } else {
>>>>>>>                 cometEvent.close();
>>>>>>>             }
>>>>>>>         }
>>>>>>>     }
>>>>>>> }
>>>>>>>
>>>>>>> ## end comet servlet ##
>>>>>>>
>>>>>>> ---------------------------------------------------------------------
>>>>>>>
>>>>>>> To start a new topic, e-mail: users@tomcat.apache.org
>>>>>>> To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
>>>>>>> For additional commands, e-mail: users-help@tomcat.apache.org
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>                           
>>>>>> ---------------------------------------------------------------------
>>>>>>
>>>>>> To start a new topic, e-mail: users@tomcat.apache.org
>>>>>> To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
>>>>>> For additional commands, e-mail: users-help@tomcat.apache.org
>>>>>>
>>>>>>
>>>>>>
>>>>>>                   
>>>>> ---------------------------------------------------------------------
>>>>> To start a new topic, e-mail: users@tomcat.apache.org
>>>>> To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
>>>>> For additional commands, e-mail: users-help@tomcat.apache.org
>>>>>
>>>>>
>>>>>
>>>>>             
>>>> ---------------------------------------------------------------------
>>>> To start a new topic, e-mail: users@tomcat.apache.org
>>>> To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
>>>> For additional commands, e-mail: users-help@tomcat.apache.org
>>>>
>>>>
>>>>
>>>>         
>>> ---------------------------------------------------------------------
>>> To start a new topic, e-mail: users@tomcat.apache.org
>>> To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
>>> For additional commands, e-mail: users-help@tomcat.apache.org
>>>
>>>
>>>
>>>     
>>
>> ---------------------------------------------------------------------
>> To start a new topic, e-mail: users@tomcat.apache.org
>> To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
>> For additional commands, e-mail: users-help@tomcat.apache.org
>>
>>
>>
>>   
>
>
>
> ---------------------------------------------------------------------
> To start a new topic, e-mail: users@tomcat.apache.org
> To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
> For additional commands, e-mail: users-help@tomcat.apache.org
>
>
>

---------------------------------------------------------------------
To start a new topic, e-mail: users@tomcat.apache.org
To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
For additional commands, e-mail: users-help@tomcat.apache.org


Re: comet read event

Posted by Filip Hanik - Dev Lists <de...@hanik.com>.
I doubt it works properly with the HttpUrlConnection, its better if you 
use a socket connection, as you have no idea how the underlying 
implementation works in HttpUrlConnection

Filip

Peter Warren wrote:
> Hi Filip,
>
> Somehow I missed your response a while back.  Below are two test clients
> and one comet servlet.  One client works, and the other doesn't.  I
> found out the failing client doesn't work because HttpURLConnection
> doesn't seem to allow writing to the output stream after the input
> stream has been requested (or at least I haven't figured out how to
> allow it).  On the other hand, Filip cautioned me against using the
> client that works because it re-sends http headers with each request,
> which could potentially get received as data by the comet servlet. 
>
> So... is there a way for me to use a single HttpURLConnection and be
> able to read and write multiple times on its input and output streams? 
> I tried setting Transfer-Encoding to chunked, but couldn't get it to
> make a difference.  I'd like to use HttpURLConnection instead of raw
> sockets to avoid having to manually handle the headers, redirects,
> proxies, etc.  I realize this question is more java api specific than
> tomcat comet specific, but since many comet users might like to use
> HttpURLConnection, I thought it was still relevant here.
>
> Thanks for any help,
> Peter
>
> ### CometTestClient1.java - this test hangs since 2nd output on
> HttpURLConnection doesn't get sent ###
>
> import java.io.IOException;
> import java.io.InputStream;
> import java.io.PrintWriter;
> import java.net.HttpURLConnection;
> import java.net.URL;
>
> public class CometTestClient1 {
>
>     private HttpURLConnection urlConn;
>
>     private PrintWriter out;
>
>     private URL url = new URL("http://127.0.0.1/CometTest");
>
>     public static void main(String[] args) throws Exception {
>         CometTestClient1 test = new CometTestClient1();
>         test.test();
>     }
>
>     public CometTestClient1() throws IOException {
>         initConnection();
>     }
>
>     private void initConnection() throws IOException {
>         urlConn = (HttpURLConnection) url.openConnection();
>         urlConn.setDoInput(true);
>         urlConn.setDoOutput(true);
>         urlConn.connect();
>         out = new PrintWriter(urlConn.getOutputStream());
>     }
>
>     public void test() throws IOException {
>         out.println("test 1");
>         out.flush();
>
>         String line = read(urlConn.getInputStream());
>         System.out.println(line);
>
>         // next line never gets sent out -- presumably because the url
> connection
>         // doesn't allow output after getInputStream has been called
>         out.println("test 2");
>         out.flush();
>
>         line = read(urlConn.getInputStream());
>         System.out.println(line);
>
>         out.close();
>         urlConn.disconnect();
>     }
>
>     private String read(InputStream is) throws IOException {
>         StringBuffer inputBuffer = new StringBuffer();
>         byte[] buf = new byte[512];
>         do {
>             int n = is.read(buf); // can throw an IOException
>             if (n > 0) {
>                 inputBuffer.append(new String(buf, 0, n));
>             } else if (n < 0) {
>                 return ("read error");
>             }
>         } while (is.available() > 0);
>         return inputBuffer.toString();
>     }
> }
>
> ### CometTestClient2.java - works but sends new http headers for each
> client output ###
>
> import java.io.BufferedReader;
> import java.io.IOException;
> import java.io.InputStreamReader;
> import java.io.PrintWriter;
> import java.net.HttpURLConnection;
> import java.net.URL;
>
> public class CometTestClient2 {
>
>     private HttpURLConnection urlConn;
>
>     private PrintWriter out;
>
>     private URL url = new URL("http://127.0.0.1/CometTest");
>
>     public static void main(String[] args) throws Exception {
>         CometTestClient2 test = new CometTestClient2();
>         test.test();
>     }
>
>     public CometTestClient2() throws IOException {
>         initConnection();
>     }
>
>     private void initConnection() throws IOException {
>         urlConn = (HttpURLConnection) url.openConnection();
>         urlConn.setDoInput(true);
>         urlConn.setDoOutput(true);
>         urlConn.connect();
>         out = new PrintWriter(urlConn.getOutputStream());
>     }
>
>     public void test() throws IOException {
>         out.println("test 1");
>         out.flush();
>
>         BufferedReader in = new BufferedReader(new
> InputStreamReader(urlConn.getInputStream()));
>
>         String line = in.readLine();
>         System.out.println(line);
>
>         initConnection();
>         out.println("test 2");
>         out.flush();
>
>         in = new BufferedReader(new
> InputStreamReader(urlConn.getInputStream()));
>
>         line = in.readLine();
>         System.out.println(line);
>
>         out.close();
>         urlConn.disconnect();
>     }
> }
>
> ### CometTestServlet ###
>
> import java.io.IOException;
> import java.io.InputStream;
>
> import javax.servlet.ServletException;
> import javax.servlet.http.HttpServlet;
> import javax.servlet.http.HttpServletRequest;
> import javax.servlet.http.HttpServletResponse;
>
> import org.apache.catalina.CometEvent;
> import org.apache.catalina.CometProcessor;
>
> public class CometTestServlet extends HttpServlet implements
> CometProcessor {
>     private static final long serialVersionUID = 5472498184127924791L;
>
>     public void event(CometEvent cometEvent) throws IOException,
> ServletException {
>         HttpServletRequest request = cometEvent.getHttpServletRequest();
>         HttpServletResponse response = cometEvent.getHttpServletResponse();
>         // don't want timeout events
>         cometEvent.setTimeout(1000000);
>         if (cometEvent.getEventType() == CometEvent.EventType.BEGIN) {
>             log("Begin for session: " + request.getSession(true).getId());
>             respond(request, response);
>         } else if (cometEvent.getEventType() ==
> CometEvent.EventType.ERROR) {
>             log("Error for session: " + request.getSession(true).getId()
> + ", " + cometEvent.getEventSubType());
>             cometEvent.close();
>         } else if (cometEvent.getEventType() == CometEvent.EventType.END) {
>             log("End for session: " + request.getSession(true).getId());
>             cometEvent.close();
>         } else if (cometEvent.getEventType() == CometEvent.EventType.READ) {
>             log("Read for session: " + request.getSession(true).getId());
>             respond(request, response);
>         }
>     }
>
>     private void respond(HttpServletRequest request, HttpServletResponse
> response) throws IOException {
>         String clientMessage = read(request);
>         if (clientMessage != null && clientMessage.length() > 0) {
>             response.getWriter().println(clientMessage);
>             response.getWriter().flush();
>         }
>     }
>
>     private String read(HttpServletRequest request) throws IOException {
>         InputStream is = request.getInputStream();
>         StringBuffer inputBuffer = new StringBuffer();
>         byte[] buf = new byte[512];
>         do {
>             int n = is.read(buf); // can throw an IOException
>             if (n > 0) {
>                 inputBuffer.append(new String(buf, 0, n));
>                 log("Read " + n + " bytes: " + new String(buf, 0, n) + "
> for session: "
>                         + request.getSession(true).getId());
>             } else if (n < 0) {
>                 log("comet read error");
>             }
>         } while (is.available() > 0);
>         return inputBuffer.toString();
>     }
> }
>
> Filip Hanik - Dev Lists wrote:
>   
>> why don't you make your test available, I'll run it through
>>
>> Filip
>>
>> Peter Warren wrote:
>>     
>>> Yes, I'm using the NIO connector.  Here is the config line from my
>>> server.xml:
>>>
>>>     <Connector port="80"
>>> protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="150"
>>> connectionTimeout="20000" keepAliveTimeout="120000"
>>> maxKeepAliveRequests="-1" acceptorThreadCount="2" redirectPort="8443" />
>>>
>>> Are there any other configuration options I need to set?
>>>
>>> Peter
>>>
>>> Filip Hanik - Dev Lists wrote:
>>>  
>>>       
>>>> and you are using the APR or the NIO connector right?
>>>>
>>>> Filip
>>>>
>>>> Peter Warren wrote:
>>>>    
>>>>         
>>>>> Thanks for the suggestion.  I changed the comet test servlet to read
>>>>> directly from the input stream as shown in the advanced io
>>>>> example.  I'm
>>>>> still seeing the same behavior.  No comet read event gets generated on
>>>>> the server, only the begin event which contains the client's first
>>>>> message.  The client then sends its second message and blocks waiting
>>>>> for the server.  No events are generated on the server in response to
>>>>> the client's second message.  Any other tips for me?
>>>>>
>>>>> Thanks,
>>>>> Peter
>>>>>
>>>>> from the CometTestServlet:
>>>>>
>>>>>     public void event(CometEvent cometEvent) throws IOException,
>>>>> ServletException {
>>>>>     ...
>>>>>         if (cometEvent.getEventType() == CometEvent.EventType.BEGIN) {
>>>>>             log("Begin for session: " +
>>>>> request.getSession(true).getId());
>>>>>             String clientMessage = read(request);
>>>>>             if (clientMessage != null && clientMessage.length() > 0) {
>>>>>                 response.getWriter().println(clientMessage);
>>>>>                 response.getWriter().flush();
>>>>>             }
>>>>>         }
>>>>>     ...
>>>>>
>>>>>     private String read(HttpServletRequest request) throws
>>>>> IOException {
>>>>>         InputStream is = request.getInputStream();
>>>>>         StringBuffer inputBuffer = new StringBuffer();
>>>>>         byte[] buf = new byte[512];
>>>>>         do {
>>>>>             int n = is.read(buf); // can throw an IOException
>>>>>             if (n > 0) {
>>>>>                 inputBuffer.append(new String(buf, 0, n));
>>>>>                 log("Read " + n + " bytes: " + new String(buf, 0,
>>>>> n) + "
>>>>> for session: "
>>>>>                         + request.getSession(true).getId());
>>>>>             } else if (n < 0) {
>>>>>                 log("comet read error");
>>>>>             }
>>>>>         } while (is.available() > 0);
>>>>>         return inputBuffer.toString();
>>>>>     }
>>>>>
>>>>> from the CometTestClient:
>>>>>
>>>>>     public void test() throws IOException {
>>>>>         out.println("test 1");
>>>>>         out.flush();
>>>>>
>>>>>         String line = read(urlConn.getInputStream());
>>>>>         System.out.println(line);
>>>>>
>>>>>         out.println("test 2");
>>>>>         out.flush();
>>>>>
>>>>>         line = read(urlConn.getInputStream());
>>>>>         System.out.println(line);
>>>>>
>>>>>         out.close();
>>>>>         urlConn.disconnect();
>>>>>     }
>>>>>
>>>>>     private String read(InputStream is) throws IOException {
>>>>>         StringBuffer inputBuffer = new StringBuffer();
>>>>>         byte[] buf = new byte[512];
>>>>>         do {
>>>>>             int n = is.read(buf); // can throw an IOException
>>>>>             if (n > 0) {
>>>>>                 inputBuffer.append(new String(buf, 0, n));
>>>>>             } else if (n < 0) {
>>>>>                 return ("read error");
>>>>>             }
>>>>>         } while (is.available() > 0);
>>>>>         return inputBuffer.toString();
>>>>>     }
>>>>>
>>>>> Filip Hanik - Dev Lists wrote:
>>>>>  
>>>>>      
>>>>>           
>>>>>> take a look at the documentation, the way you are reading it is
>>>>>> incorrect.
>>>>>> you need to take advantage of the available() method
>>>>>>
>>>>>> Filip
>>>>>>
>>>>>> Peter Warren wrote:
>>>>>>           
>>>>>>             
>>>>>>> My BEGIN block in my comet servlet now looks like the code below
>>>>>>> (added
>>>>>>> a while loop to read until the buffer is empty).  Is that what
>>>>>>> you had
>>>>>>> in mind?  The buffer in the BEGIN event only contains the client's
>>>>>>> first
>>>>>>> message.  Am I not emptying the buffer correctly?  Although, I
>>>>>>> wouldn't
>>>>>>> expect the buffer to contain the client's second message since the
>>>>>>> client blocks for an ack from the server before sending its second
>>>>>>> message.  Any other thoughts on what happens to the client's second
>>>>>>> message and why no READ event is generated?
>>>>>>>
>>>>>>> Thanks for your help,
>>>>>>> Peter
>>>>>>>
>>>>>>>         if (cometEvent.getEventType() ==
>>>>>>> CometEvent.EventType.BEGIN) {
>>>>>>>             log("Begin for session: " +
>>>>>>> request.getSession(true).getId());
>>>>>>>             BufferedReader reader =
>>>>>>> cometEvent.getHttpServletRequest().getReader();
>>>>>>>             String line = null;
>>>>>>>             while ((line = reader.readLine()) != null) {
>>>>>>>                 log("servlet received: " + line);
>>>>>>>             
>>>>>>> cometEvent.getHttpServletResponse().getWriter().println("servlet
>>>>>>> received: " + line);
>>>>>>>               
>>>>>>> cometEvent.getHttpServletResponse().getWriter().flush();
>>>>>>>             }
>>>>>>>         }
>>>>>>>
>>>>>>>  
>>>>>>>               
>>>>>>>               
>>>>>>>> Filip Hanik wrote:
>>>>>>>>
>>>>>>>> it could be because the data from the request already came in with
>>>>>>>> the
>>>>>>>>                         
>>>>>>>>                 
>>>>>>> request.
>>>>>>>  
>>>>>>>               
>>>>>>>               
>>>>>>>> when the BEGIN happens, perform the actions as if there was a
>>>>>>>> READ as
>>>>>>>>                         
>>>>>>>>                 
>>>>>>> well, ie, empty out the buffer.
>>>>>>>  
>>>>>>>               
>>>>>>>               
>>>>>>>> Filip
>>>>>>>>                         
>>>>>>>>                 
>>>>>>> Peter Warren wrote:
>>>>>>>  
>>>>>>>               
>>>>>>>               
>>>>>>>> The following client code generates a comet BEGIN event on the
>>>>>>>> server
>>>>>>>> but not a subsequent READ event, as I was expecting.  How come?
>>>>>>>> Is my
>>>>>>>> code wrong?  Are my expectations wrong?  See sequence of events
>>>>>>>> commented in code below.
>>>>>>>>
>>>>>>>>     // client test method that sends messages to server and
>>>>>>>> listens for
>>>>>>>> responses
>>>>>>>>     public void test() throws IOException {
>>>>>>>>         out.println("test 1");
>>>>>>>>         out.flush();
>>>>>>>>
>>>>>>>>         // server receives client's message, generates a BEGIN
>>>>>>>> event,
>>>>>>>> and sends response to client
>>>>>>>>
>>>>>>>>         in = new BufferedReader(new
>>>>>>>> InputStreamReader(urlConn.getInputStream()));
>>>>>>>>         System.out.println(in.readLine());
>>>>>>>>
>>>>>>>>         // client receives server's response and prints it
>>>>>>>>
>>>>>>>>         out.println("test 2");
>>>>>>>>         out.flush();
>>>>>>>>
>>>>>>>>         System.out.println(in.readLine());
>>>>>>>>
>>>>>>>>         // client code blocks here waiting for server response.
>>>>>>>>         // server never generates a READ event.  How come?
>>>>>>>>         // Does the HttpURLConnection (see full code below) need
>>>>>>>> to be
>>>>>>>> set up differently?
>>>>>>>>         // Am I using the PrintWriter incorrectly when sending
>>>>>>>> to the
>>>>>>>> comet servlet?
>>>>>>>>
>>>>>>>>         out.close();
>>>>>>>>         urlConn.disconnect();
>>>>>>>>     }
>>>>>>>>
>>>>>>>> Thanks for any help,
>>>>>>>> Peter
>>>>>>>>
>>>>>>>> -- system --
>>>>>>>>
>>>>>>>> using:
>>>>>>>> tomcat 6.0.13 on windows xp sp 2
>>>>>>>> java 1.6.0_01
>>>>>>>>
>>>>>>>> -- test client & comet servlet source below --
>>>>>>>>
>>>>>>>> ## begin test client ##
>>>>>>>>
>>>>>>>> import java.io.BufferedReader;
>>>>>>>> import java.io.IOException;
>>>>>>>> import java.io.InputStreamReader;
>>>>>>>> import java.io.PrintWriter;
>>>>>>>> import java.net.HttpURLConnection;
>>>>>>>> import java.net.URL;
>>>>>>>>
>>>>>>>> public class CometTestClient {
>>>>>>>>
>>>>>>>>     private HttpURLConnection urlConn;
>>>>>>>>
>>>>>>>>     private PrintWriter out;
>>>>>>>>
>>>>>>>>     private BufferedReader in;
>>>>>>>>
>>>>>>>>     public static void main(String[] args) throws Exception {
>>>>>>>>         CometTestClient test = new CometTestClient();
>>>>>>>>         test.test();
>>>>>>>>     }
>>>>>>>>
>>>>>>>>     public CometTestClient() throws IOException {
>>>>>>>>         initConnection();
>>>>>>>>     }
>>>>>>>>
>>>>>>>>     private void initConnection() throws IOException {
>>>>>>>>         URL url = new URL("http://127.0.0.1/CometTest");
>>>>>>>>         urlConn = (HttpURLConnection) url.openConnection();
>>>>>>>>         urlConn.setDoInput(true);
>>>>>>>>         urlConn.setDoOutput(true);
>>>>>>>>         urlConn.connect();
>>>>>>>>         out = new PrintWriter(urlConn.getOutputStream());
>>>>>>>>     }
>>>>>>>>
>>>>>>>>     public void test() throws IOException {
>>>>>>>>         out.println("test 1");
>>>>>>>>         out.flush();
>>>>>>>>
>>>>>>>>         in = new BufferedReader(new
>>>>>>>> InputStreamReader(urlConn.getInputStream()));
>>>>>>>>         System.out.println(in.readLine());
>>>>>>>>
>>>>>>>>         out.println("test 2");
>>>>>>>>         out.flush();
>>>>>>>>
>>>>>>>>         System.out.println(in.readLine());
>>>>>>>>
>>>>>>>>         out.close();
>>>>>>>>         urlConn.disconnect();
>>>>>>>>     }
>>>>>>>> }
>>>>>>>>
>>>>>>>> ## end test client ##
>>>>>>>>
>>>>>>>> ## begin comet servlet ##
>>>>>>>>
>>>>>>>> import java.io.BufferedReader;
>>>>>>>> import java.io.IOException;
>>>>>>>>
>>>>>>>> import javax.servlet.ServletException;
>>>>>>>> import javax.servlet.http.HttpServlet;
>>>>>>>> import javax.servlet.http.HttpServletRequest;
>>>>>>>>
>>>>>>>> import org.apache.catalina.CometEvent;
>>>>>>>> import org.apache.catalina.CometProcessor;
>>>>>>>>
>>>>>>>> public class CometTestServlet extends HttpServlet implements
>>>>>>>> CometProcessor {
>>>>>>>>     private static final long serialVersionUID =
>>>>>>>> 5472498184127924791L;
>>>>>>>>
>>>>>>>>     public void event(CometEvent cometEvent) throws IOException,
>>>>>>>> ServletException {
>>>>>>>>         HttpServletRequest request =
>>>>>>>> cometEvent.getHttpServletRequest();
>>>>>>>>         // don't want timeout events
>>>>>>>>         cometEvent.setTimeout(1000000);
>>>>>>>>         if (cometEvent.getEventType() ==
>>>>>>>> CometEvent.EventType.BEGIN) {
>>>>>>>>             log("Begin for session: " +
>>>>>>>> request.getSession(true).getId());
>>>>>>>>             BufferedReader reader =
>>>>>>>> cometEvent.getHttpServletRequest().getReader();
>>>>>>>>             String line = reader.readLine();
>>>>>>>>             if (line != null) {
>>>>>>>>                 log("servlet received: " + line);
>>>>>>>>            
>>>>>>>> cometEvent.getHttpServletResponse().getWriter().println("servlet
>>>>>>>> received: " + line);
>>>>>>>>              
>>>>>>>> cometEvent.getHttpServletResponse().getWriter().flush();
>>>>>>>>             } else {
>>>>>>>>                 cometEvent.close();
>>>>>>>>             }
>>>>>>>>         } else if (cometEvent.getEventType() ==
>>>>>>>> CometEvent.EventType.ERROR) {
>>>>>>>>             log("Error for session: " +
>>>>>>>> request.getSession(true).getId()
>>>>>>>> + ", " + cometEvent.getEventSubType());
>>>>>>>>             cometEvent.close();
>>>>>>>>         } else if (cometEvent.getEventType() ==
>>>>>>>> CometEvent.EventType.END) {
>>>>>>>>             log("End for session: " +
>>>>>>>> request.getSession(true).getId());
>>>>>>>>             cometEvent.close();
>>>>>>>>         } else if (cometEvent.getEventType() ==
>>>>>>>> CometEvent.EventType.READ) {
>>>>>>>>             log("Read for session: " +
>>>>>>>> request.getSession(true).getId());
>>>>>>>>             BufferedReader reader =
>>>>>>>> cometEvent.getHttpServletRequest().getReader();
>>>>>>>>             String line = reader.readLine();
>>>>>>>>             if (line != null) {
>>>>>>>>            
>>>>>>>> cometEvent.getHttpServletResponse().getWriter().println("servlet
>>>>>>>> received: " + line);
>>>>>>>>             } else {
>>>>>>>>                 cometEvent.close();
>>>>>>>>             }
>>>>>>>>         }
>>>>>>>>     }
>>>>>>>> }
>>>>>>>>
>>>>>>>> ## end comet servlet ##
>>>>>>>>
>>>>>>>> ---------------------------------------------------------------------
>>>>>>>>
>>>>>>>> To start a new topic, e-mail: users@tomcat.apache.org
>>>>>>>> To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
>>>>>>>> For additional commands, e-mail: users-help@tomcat.apache.org
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>                           
>>>>>>>>                 
>>>>>>> ---------------------------------------------------------------------
>>>>>>>
>>>>>>> To start a new topic, e-mail: users@tomcat.apache.org
>>>>>>> To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
>>>>>>> For additional commands, e-mail: users-help@tomcat.apache.org
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>                   
>>>>>>>               
>>>>>> ---------------------------------------------------------------------
>>>>>> To start a new topic, e-mail: users@tomcat.apache.org
>>>>>> To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
>>>>>> For additional commands, e-mail: users-help@tomcat.apache.org
>>>>>>
>>>>>>
>>>>>>
>>>>>>             
>>>>>>             
>>>>> ---------------------------------------------------------------------
>>>>> To start a new topic, e-mail: users@tomcat.apache.org
>>>>> To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
>>>>> For additional commands, e-mail: users-help@tomcat.apache.org
>>>>>
>>>>>
>>>>>
>>>>>         
>>>>>           
>>>> ---------------------------------------------------------------------
>>>> To start a new topic, e-mail: users@tomcat.apache.org
>>>> To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
>>>> For additional commands, e-mail: users-help@tomcat.apache.org
>>>>
>>>>
>>>>
>>>>     
>>>>         
>>> ---------------------------------------------------------------------
>>> To start a new topic, e-mail: users@tomcat.apache.org
>>> To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
>>> For additional commands, e-mail: users-help@tomcat.apache.org
>>>
>>>
>>>
>>>   
>>>       
>>
>> ---------------------------------------------------------------------
>> To start a new topic, e-mail: users@tomcat.apache.org
>> To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
>> For additional commands, e-mail: users-help@tomcat.apache.org
>>
>>
>>
>>     
>
> ---------------------------------------------------------------------
> To start a new topic, e-mail: users@tomcat.apache.org
> To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
> For additional commands, e-mail: users-help@tomcat.apache.org
>
>
>
>   


---------------------------------------------------------------------
To start a new topic, e-mail: users@tomcat.apache.org
To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
For additional commands, e-mail: users-help@tomcat.apache.org