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: [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]
---------------------------------------------------------------------
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]
---------------------------------------------------------------------
To start a new topic, e-mail: users@tomcat.apache.org
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]