views:

71

answers:

2

I have created a java program which acts as Rest Web Server. It gets the http request and send response. I am getting the http request as Input Stream inside my server. I want to convert this Input stream to String and then want to parse string according to some predefined pattern. The problem is when I get the input Stream and tries to convert it to String, it will not finish the operation until new request comes or the original request is terminated. If any of these two events happen only then the Input stream is successfully converted to string otherwise itjust gets hanged there. Am I missing any thing ? Any Suggestions will be very helpful.

  ServerSocket service = new ServerSocket(Integer.parseInt(argv[0]));
  Socket connection = service.accept();

                InputStream is = connection.getInputStream();
                String ss = IOUtils.toString(is);
                System.out.println("PRINT : "+ss);

Now the ss is only printed when the old request is terminated or the new request is accepted at socket. I want to convert it to string within the same request.

Please Suggest me what i am doing wrong?

Thanks, Tara Singh

A: 

What you are doing wrong is that you want to convert a stream to a string a operation that is only possible when the stream is finished. That is why you get your string when the connection is terminated. How else is the method toString supposed to know when there is no more data comming and it should begin the conversion? What if it spits a string and in the meantime more data arrive in the stream? I guess you won't be happy then too :)

In short: you must somehow know when you are finished receiving before converting to string. Redesign your app.

avok00
Thank you for your answer. I got your point.
Tara Singh
+1  A: 

You should read the request in steps. First read the headers, line for line. Then, if it's a POST request, there will be a request body. If that's the case, you should have read a Content-Length header before, which says how long the body is in bytes. You should read that number of bytes from the input stream.

Most of that is already handled for you if you make this app as a servlet, or if that's not possible, using an HTTP server library.

Bart van Heukelom
Thank you for your suggestion, Actually I also redesigned it in the same way.
Tara Singh
The requirement was to design a standalone server. Thus I am doing it myself. Thanks for suggestions.
Tara Singh