Hi Thomas, You could try not sending a content length header. This may or may not work. Have a look at :
<http://jakarta.apache.org/commons/httpclient/3.0/xref/org/apache/commons/httpclient/methods/EntityEnclosingMethod.html#392> Mike On Tue, 15 Mar 2005 18:03:28 +0100, Thomas F�rster <[EMAIL PROTECTED]> wrote: > 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] > > --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
