tomcat-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Filip Hanik - Dev Lists <devli...@hanik.com>
Subject Re: [maybe not solved] comet read event
Date Sat, 02 Jun 2007 09:37:03 GMT
Peter Warren wrote:
> Hmm, ok.  Sending the headers up causes the comet servlet to behave as I
> expected, one BEGIN event generated on the first client request and one
> READ event generated on the second request.  In my simple test, the
> comet servlet doesn't receive the headers as data.  If I don't send up
> the headers on the second request, the READ event is never generated (in
> fact no event is generated) and the client hangs waiting for a response
> from the comet servlet.  Doesn't your cometgui send the headers with
> each request?
>   
nope, cause I modify the next request to not send headers, cometgui is 
100% manual :)

Filip
> Peter
>
> Filip Hanik - Dev Lists wrote:
>   
>> you're treading dangerous waters my friend. the comet is somewhat like
>> a real socket, and sending up new HTTP headers might end up just being
>> data for the Comet servlet.
>>
>> Filip
>>
>> Peter Warren wrote:
>>     
>>> My client code was the problem.  I had been thinking of the comet
>>> interaction with the server as similar to a socket, open it once and
>>> then read and write merrily from either end.  I forgot that comet is
>>> still operating over http and the client needs to send http headers for
>>> each request.  So the fix in my client code is simply to open a new
>>> HttpURLConnection for each client request, which hopefully does not
>>> establish a new socket connection to the server each time ("Each
>>> HttpURLConnection instance is used to make a single request but the
>>> underlying network connection to the HTTP server may be transparently
>>> shared by other instances" -- from javadoc for HttpURLConnection).  See
>>> added "initConnection()" line below.
>>>
>>> Peter
>>>
>>> ### from CometTestClient below ###
>>>
>>>     public void test() throws IOException {
>>>         out.println("test 1");
>>>         out.flush();
>>>
>>>         String line = read(urlConn.getInputStream());
>>>         System.out.println(line);
>>>
>>> --->    initConnection(); // reconnect to url - sends new http headers
>>>         out.println("test 2");
>>>         out.flush();
>>>
>>>         line = read(urlConn.getInputStream());
>>>         System.out.println(line);
>>>
>>>         out.close();
>>>         urlConn.disconnect();
>>>     }
>>>
>>>
>>> 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


Mime
View raw message