hc-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Michael Becke <mbe...@gmail.com>
Subject Re: Asynchronous client-server communication
Date Tue, 15 Mar 2005 18:07:26 GMT
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 <ml@thofoer.de> 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 <mbecke@gmail.com> 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 <ml@thofoer.de> 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: httpclient-dev-unsubscribe@jakarta.apache.org
> >> For additional commands, e-mail: httpclient-dev-help@jakarta.apache.org
> >>
> >>
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: httpclient-dev-unsubscribe@jakarta.apache.org
> > For additional commands, e-mail: httpclient-dev-help@jakarta.apache.org
> >
> >
> 
> --
> Using M2, Opera's revolutionary e-mail client: http://www.opera.com/m2/
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: httpclient-dev-unsubscribe@jakarta.apache.org
> For additional commands, e-mail: httpclient-dev-help@jakarta.apache.org
> 
>

---------------------------------------------------------------------
To unsubscribe, e-mail: httpclient-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: httpclient-dev-help@jakarta.apache.org


Mime
View raw message