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: multiple comet requests
Date Tue, 14 Aug 2007 23:03:10 GMT
turns out that if the request is comet, the recycling of the 
input/output filter is not happening.
I have fixed this,
you can try the tomcat-coyote.jar from
http://people.apache.org/~fhanik/tomcat/tomcat-coyote.jar

Filip

Filip Hanik - Dev Lists wrote:
> hi Peter,
> thanks for the example, I am able to reproduce this error, let me take 
> a look and see why it is happening,
>
> Filip
>
> Peter Warren wrote:
>> How do you send multiple requests to the same comet servlet?
>>
>> Sending multiple chunks of a single request is fine.  My problem occurs
>> after the client ends the chunked transaction by sending "0CRLFCRLF" 
>> to the
>> server.  The comet servlet correctly registers the END event.
>>
>> But then the client subsequently tries to initiate a new chunked 
>> request by
>> sending new http headers and a new chunk.  The comet servlet receives a
>> BEGIN event, immediately followed by an END event.  A READ event is 
>> never
>> generated for the new chunk.  No ERROR events are registered either.
>>
>> Sequence:
>> 1st request
>> BEGIN
>> READ
>> END
>>
>> 2nd request
>> BEGIN
>> END - why an END event and not a READ?
>>
>> Below are my test client and test comet servlet.  Any thoughts on 
>> what I'm
>> doing wrong?
>>
>> (I apologize in advance if this is a lack of understanding of http on my
>> part.  I have looked at the specs and tried to follow the rules but 
>> am still
>> running into problems.)
>>
>> Thanks,
>> Peter
>>
>> -----
>>
>> <test servlet>
>> 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());
>>         } 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().print(clientMessage);
>>             response.getWriter().flush();
>>         }
>>     }
>>
>>     private String read(HttpServletRequest request) throws IOException {
>>         InputStream is = request.getInputStream();
>>         StringBuffer inputBuffer = new StringBuffer();
>>         byte[] buf = new byte[512];
>>         while (is.available() > 0) {
>>             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");
>>             }
>>         }
>>         return inputBuffer.toString();
>>     }
>> }
>> </test servlet>
>>
>> -----
>>
>> <test client>
>> import java.io.IOException;
>> import java.io.InputStream;
>> import java.io.OutputStream;
>> import java.net.Socket;
>>
>> public class CometTestClient1 {
>>
>>     public static final String ENCODING = "ISO-8859-1";
>>
>>     private Socket socket;
>>
>>     private OutputStream out;
>>
>>     public static void main(String[] args) throws Exception {
>>         CometTestClient1 test = new CometTestClient1();
>>         test.test();
>>     }
>>
>>     public CometTestClient1() throws IOException {
>>         initConnection();
>>     }
>>
>>     private void initConnection() throws IOException {
>>         socket = new Socket("127.0.0.1", 80);
>>         socket.setKeepAlive(true);
>>         out = socket.getOutputStream();
>>         sendHeaders();
>>     }
>>
>>     private void sendHeaders() throws IOException {
>>         println("GET /CometTest HTTP/1.1");
>>         println("Host: 127.0.0.1");
>>         println("User-Agent: test");
>>         println("Transfer-Encoding: chunked");
>>         println("Connection: keep-alive");
>>     }
>>
>>     private void test() throws IOException {
>>         sendChunkedMessage();
>>         try {
>>             Thread.sleep(60000);
>>         } catch (InterruptedException ie) {
>>             ie.printStackTrace();
>>         }
>>     // doesn't seem to matter if I create a new socket connection or not
>>         //initConnection();
>>         sendHeaders();
>>         sendChunkedMessage();
>>
>>     }
>>
>>     private void sendChunkedMessage() throws IOException {
>>         println();
>>         println("10");
>>         print("test data test 1");
>>         out.flush();
>>
>>         String line = read();
>>         System.out.println(line);
>>
>>         println();
>>         println("0");
>>         println();
>>         out.flush();
>>
>>         line = read();
>>         System.out.println(line);
>>     }
>>
>>     private void print(String chars) throws IOException {
>>         out.write(chars.getBytes(ENCODING));
>>     }
>>
>>     private void println(String chars) throws IOException {
>>         out.write((chars + "\r\n").getBytes(ENCODING));
>>     }
>>
>>     private void println() throws IOException {
>>         out.write(("\r\n").getBytes(ENCODING));
>>     }
>>
>>     private String read() throws IOException {
>>         InputStream in = socket.getInputStream();
>>         StringBuffer inputBuffer = new StringBuffer();
>>         byte[] buf = new byte[512];
>>         do {
>>             int n = in.read(buf); // can throw an IOException
>>             if (n > 0) {
>>                 inputBuffer.append(new String(buf, 0, n));
>>             } else if (n < 0) {
>>                 return ("read error");
>>             }
>>         } while (in.available() > 0);
>>         return inputBuffer.toString();
>>     }
>> }
>> </test client>
>>
>> -----
>>
>> <test results>
>> HTTP/1.1 200 OK
>> Server: Apache-Coyote/1.1
>> Set-Cookie: JSESSIONID=775B71AFC0066AA45224A4F00309D101; Path=/
>> Transfer-Encoding: chunked
>> Date: Tue, 14 Aug 2007 20:00:49 GMT
>>
>> 10
>> test data test 1
>>
>> 0
>>
>>
>> HTTP/1.1 200 OK
>> Server: Apache-Coyote/1.1
>> Set-Cookie: JSESSIONID=BF0C8B7A0D27CDCA6A285F9C4C598613; Path=/
>> Content-Length: 0
>> Date: Tue, 14 Aug 2007 20:00:49 GMT
>>
>>
>> read error
>> </test results>
>>
>> -----
>>
>> connector configuration for tomcat 6.0.14 on windows xp:
>> <Connector port="80" 
>> protocol="org.apache.coyote.http11.Http11NioProtocol"
>> maxThreads="150" connectionTimeout="120000" keepAliveTimeout="300000"
>> maxKeepAliveRequests="-1" socket.soKeepAlive="true" 
>> acceptorThreadCount="2"
>> redirectPort="8443" />
>>
>> -----
>>
>> Catalina log registering begin, read, and end events for initial 
>> request,
>> followed by begin and end events for subsequent request:
>>
>> Aug 14, 2007 1:02:37 PM org.apache.catalina.core.ApplicationContext log
>> INFO: CometTest: Begin for session: 910EA1A41AB07465D61585930564AFD0
>> Aug 14, 2007 1:02:37 PM org.apache.catalina.core.ApplicationContext log
>> INFO: CometTest: Read for session: 910EA1A41AB07465D61585930564AFD0
>> Aug 14, 2007 1:02:37 PM org.apache.catalina.core.ApplicationContext log
>> INFO: CometTest: End for session: 910EA1A41AB07465D61585930564AFD0
>> Aug 14, 2007 1:02:37 PM org.apache.catalina.core.ApplicationContext log
>> INFO: CometTest: Begin for session: 22A5A802D4A201A024939BE724A1F530
>> Aug 14, 2007 1:02:37 PM org.apache.catalina.core.ApplicationContext log
>> INFO: CometTest: End for session: 22A5A802D4A201A024939BE724A1F530
>>
>>   
>> ------------------------------------------------------------------------
>>
>> No virus found in this incoming message.
>> Checked by AVG Free Edition. Version: 7.5.476 / Virus Database: 
>> 269.11.17/951 - Release Date: 8/13/2007 10:15 AM
>>   
>
>
> ---------------------------------------------------------------------
> 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