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 22:37:50 GMT
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


Mime
View raw message