even with your code, I wasn't able to replicate what you were seeing.
what I would need to see what's going on for you:

1. a war file with your comet server, and source code
2. a test client
3. your server.xml

Filip

Peter Warren wrote:
Thanks, Filip, for your time on this!  I used your changes and still
get an END event.  With your changes the client and socket are
definitely staying alive now.  I stepped through the client code and
see the end event appear on the server as soon as I step through the
line that writes the 0crlfcrlf:

        byte[] outputBytes = new String("0" + DELIMITER +
DELIMITER).getBytes(ENCODING);
-->    outputStream.write(outputBytes); // end event appears after this line

Anyway, I don't want to take up any more of your time on this.  I'm
using non-chunked httpurlconnections now, which are working fine for
me with comet.  I just wanted to let you know the behavior I'm seeing
on my machine.  It's possible there are problems with my test, but
you've got the code I'm using.  Maybe there's a configuration
difference on our tomcats?

If you want to pursue this further, let me know, and I'm happy to get
you any more information you need.  Otherwise, I appreciate your time
and thanks for all your work on tomcat!

Peter

On Jan 22, 2008 2:37 PM, Filip Hanik - Dev Lists <[EMAIL PROTECTED]> wrote:
your test client is wrong,I've pasted in the correct one

only three changes
1. set the timeout so that the socket stays alive
2. keep reading data so that the socket stays alive
3. 0crlfcrlf as the last chunk

works as expected. to make a workable client, it should read until it
gets the last-chunk, not read forever like I am doing. I just didn't see
the need to put in http parsing in the code to demonstrate it.

also, I applied the timeout patch that I wrote about earlier,so I am
setting the timeout in the comet servlet, without the patch its using
the connectionTimeout value

package test;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.NoRouteToHostException;
import java.net.Socket;
import java.net.URL;

public class TestClient {

    private static final String ENCODING = "ISO-8859-1";

    private static final String DELIMITER = "\r\n";

    private URL url;

    private InputStream inputStream;

    private OutputStream outputStream;

    private Socket socket;

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

    private void test() throws Exception {
        url = new URL("http://localhost:8080/comet";);
        initConnection();
        sendHeaders();
        send("comet test");
        // uncomment sleep to get END event instead of read error
//        try {
//            Thread.sleep(50);
//        } catch (InterruptedException ie) {
//            // do nothing
//        }
        sendLastChunk();
    // block on read to keep app alive - server never sends response
        byte[] data = new byte[8192];
        int result = inputStream.read(data);

        while (result>0) {
            String s = new String(data,0,result);
            System.out.println("Received data:\n"+s);
            result = inputStream.read(data);
        }
        {
            System.out.println("Received EOF");
        }
    }

    private void initConnection() throws IOException {
        int port = url.getPort();
        port = (port < 0) ? url.getDefaultPort() : port;
        try {
            socket = new Socket(url.getHost(), port);
            socket.setSoTimeout(Integer.MAX_VALUE);

            socket.setKeepAlive(true);
            inputStream = socket.getInputStream();
            outputStream = socket.getOutputStream();
        } catch (NoRouteToHostException nrthe) {
            System.out.println("host: " + url.getHost());
            nrthe.printStackTrace();
        }
    }

    private void sendHeaders() throws IOException {
        String path = url.getPath();
        StringBuffer outputBuffer = new StringBuffer();
        outputBuffer.append("POST " + path + " HTTP/1.1" + DELIMITER);
        outputBuffer.append("Host: " + url.getHost() + DELIMITER);
        outputBuffer.append("User-Agent: CometTest" + DELIMITER);
        outputBuffer.append("Connection: keep-alive" + DELIMITER);
        outputBuffer.append("Content-Type: text/plain" + DELIMITER);
        outputBuffer.append("Transfer-Encoding: chunked" + DELIMITER);
        outputBuffer.append(DELIMITER);
        byte[] outputBytes = outputBuffer.toString().getBytes(ENCODING);
        outputStream.write(outputBytes);
        outputStream.flush();
    }

    private void send(String chunkData) throws IOException {
        byte[] chunkBytes = chunkData.getBytes(ENCODING);
        String hexChunkLength = Integer.toHexString(chunkBytes.length);
        StringBuffer outputBuffer = new StringBuffer();
        outputBuffer.append(hexChunkLength);
        outputBuffer.append(DELIMITER);
        outputBuffer.append(chunkData);
        outputBuffer.append(DELIMITER);
        byte[] outputBytes = outputBuffer.toString().getBytes(ENCODING);
        outputStream.write(outputBytes);
        outputStream.flush();
    }

    private void sendLastChunk() throws IOException {
        byte[] outputBytes = new String("0" +
DELIMITER+DELIMITER).getBytes(ENCODING);
        outputStream.write(outputBytes);
        outputStream.flush();
    }
}


Peter Warren wrote:
Just to make sure that I wasn't crazy, I did some more tests,
including using your cometgui.jar.  My results still show both read
errors and END events.  Is it possible that it's a platform issue?
I'm running Windows XP Pro SP2.  As I mentioned before I'm using the
tomcat 6.0.x trunk as of 21-01-2008.  Also, I re-started tomcat in
between all tests to make sure there weren't stray bytes hanging
around somewhere.  My server code is the same as shown previously in
this thread.

Peter

Here are my results:

1) Running LastChunkTest (code below) with last chunk of 0crlfcrlf,
server shows:

event: BEGIN, subtype: null
event: READ, subtype: null
Read 10 bytes: comet test for session: 627378C9DEE2817A93EBAC190DE47599
read error

2) Running LastChunkTest with last chunk of 0crlfcrlf and a 50 ms
sleep before sending last chunk, server shows:

event: BEGIN, subtype: null
event: READ, subtype: null
Read 10 bytes: comet test for session: A00EFFC9A9FE8CBF1833D204EF00667C
event: END, subtype: null

3) Running LastChunkTest with a last chunk of 0crlf, server shows:

event: BEGIN, subtype: null
event: READ, subtype: null
Read 10 bytes: comet test for session: DD41C198E3D5CD6E7D73FC0D7B37E86F

4) Running cometgui.jar with 0crlfcrlf:

client sends (without the dashes):

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



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





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

Reply via email to