hc-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Thomas Förster ...@thofoer.de>
Subject Re: Asynchronous client-server communication
Date Tue, 15 Mar 2005 17:03:28 GMT
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


Mime
View raw message