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: comet read event
Date Thu, 24 May 2007 10:41:27 GMT
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


Mime
View raw message