Thank you for the answer, it was very helpful. Now I subclassed PostMethod and overrode writeRequestBody() where I use the connection's output-stream. This works pretty well (but admittedly it looks pretty ugly):
HttpClient client = new HttpClient(); PostMethod httppost = new PostMethod(BASE_URL +"?mode=in") {
protected boolean writeRequestBody(HttpState state, HttpConnection conn) throws IOException, HttpException {
PrintWriter out = new PrintWriter(conn.getRequestOutputStream());
for (int i=0;i<3;i++){
System.out.println("->send "+i);
out.println("test "+i);
out.flush();
try {
Thread.sleep(3000);
} catch (InterruptedException e) {}
}
System.out.println("EXIT");
conn.getRequestOutputStream().flush();
conn.getRequestOutputStream().close();
return true;
}
}; httppost.setContentChunked(false);
httppost.setRequestEntity(new RequestEntity() { public boolean isRepeatable() { return false; } public void writeRequest(OutputStream out) throws IOException {
// not called
} public long getContentLength() {
return 20000000;
} public String getContentType() {
return "text/text";
}}
);client.executeMethod(httppost);
The strings sent by the client arrive at the server instantly. The main thing I have problems with is the content length. I don't know what to choose here, since the connection is used during the whole session. So I used a very large number (hoping that a client will never send more than 20000000 bytes). I also tried it with "content-chunked", but that's causing problems, as you predicted.
Thomas
On Sat, 12 Mar 2005 10:24:17 -0500, Michael Becke <[EMAIL PROTECTED]> wrote:
Hi Thomas,
This may be difficult to make work since as you mention HTTP is not meant to be used this way. Have a look at EntityEnclosingMethod for how RequestEntities are used <http://jakarta.apache.org/commons/httpclient/3.0/xref/org/apache/commons/httpclient/methods/EntityEnclosingMethod.html#457> for some ideas. First off I think using chunked encoding will be a problem, so you'll want to not use that. Also, be sure to flush the output stream when you're done writing.
Mike
On Fri, 11 Mar 2005 18:27:26 +0100, Thomas F�rster <[EMAIL PROTECTED]> wrote:Hi!
I need to implement a bidirectional, fully asynchronous client-server communication. Normally the java.net-API would do fine, but I also have to deal with firewalls/proxies. So I'm trying to use servlets and HttpClient.
There are many examples of servlet-applet/application communication, but
due to the nature
of HTTP everything is a synchronous "client-sends-request
server-sends-response".
In my application client and server will have to send and receive data
from the other side
whenever they want. So I had the idea of creating two connections, one for
upstream and
one for downstream. These connections will have to be kept alive during
runtime of the
client session.
That's the theory. In practice I don't get the output-stream client->server to work. Here's a little code I wrote with the java.net-API: In the servlet:
public void doPost(HttpServletRequest request, HttpServletResponse
response) throws IOException, ServletException {
BufferedReader in = new BufferedReader(new
InputStreamReader(request.getInputStream()));
while(true) {
Object l = in.readLine(); // read anything from the
input stream and print it
System.out.println("recv-->"+l);
if (l==null) return;
}
}
Client-side (output-stream to server):
url = new URL( "http://127.0.0.1/url_to_servlet" ); URLConnection con = url.openConnection(); con.setDoOutput(true); con.setDoInput(true); con.setUseCaches(false); PrintWriter out = new PrintWriter(con.getOutputStream()); out.println("Hello?\n"); out.flush();
This doesn't work. Nothing is received by the servlet. Only when I add a
con.getInputStream();
to the client code (after out.flush()) the servlet receives the string. But then I cannot use the output stream anymore.
Next I tried the HttpClient PostMethod with a RequestMethod:
HttpClient client = new HttpClient();
PostMethod httppost = new
PostMethod("http://127.0.0.1/url_to_servlet");
httppost.setRequestEntity(new RequestEntity() {
public void writeRequest(OutputStream out) throws IOException
{
for (int i=0;i<3;i++){
// send 3 strings with 3 seconds pause
w.println("Hello?\n");
w.flush();
try {
Thread.sleep(3000);
} catch (InterruptedException e) { }
}
}
[....]
}
client.executeMethod(httppost);
The result is similar. The strings are not received at once by the servlet. Only when the writeRequest-method returns the three strings arrive on the server-side.
What am I doing wrong? Is that asynchronous communication possible at all?
Thank you for reading my post. Any help appreciated.
Thomas
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
-- Using M2, Opera's revolutionary e-mail client: http://www.opera.com/m2/
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
