-1

My objective is to send a simple message from a Java application (JA) to a servlet (S) and display it on the browser page. I would expect that every time I run the servlet class(refreshing browser page), I would receive the message.

I use BufferedWriter to stream output on the JA and BufferedReader on the S to receive it but I guess I am doing something wrong.

Here is code snippet from JA:

try{
      URL url = new URL("http://(/*ip address*/:8080/FirstServlet/myfirstservlet");                 
      URLConnection conn = url.openConnection();                
      conn.setDoOutput(true);
      conn.setDoInput(true);                
      BufferedWriter out = new BufferedWriter( new OutputStreamWriter( conn.getOutputStream() ) );
      out.write("testing");             
      out.flush();
      out.close();          
      BufferedReader in = new BufferedReader( new InputStreamReader(conn.getInputStream()));            
      String response;
      while( (response = in.readLine()) != null ) {
            //System.out.println( response);
      }
      in.close();
      }
      catch (MalformedURLException ex) {
            ex.printStackTrace();
      }
      catch (IOException iex) {
            iex.printStackTrace();
      }         

Here is code from S:

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.util.*;

public class FirstServlet extends HttpServlet {
   private final static String _USERNAME = "username";

   public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException , IOException {

        PrintWriter out = res.getWriter();


        BufferedReader bufferedReader = null; 
        StringBuilder stringBuilder = new StringBuilder();
        char test = 'a';
        try{
            InputStream inputStream = req.getInputStream();

            if (inputStream != null) {  
                bufferedReader = new BufferedReader(new InputStreamReader(inputStream));  

                char[] charBuffer = new char[128];  
                int bytesRead = -1;  

                while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {  
                    stringBuilder.append(charBuffer, 0, bytesRead);
                    out.println(charBuffer);  //expecting this to be displayed on browser
                }  
            } else {  
                stringBuilder.append("");
                out.println("0");
            }
        } catch (IOException ex) {  
            ex.printStackTrace(); 
        }

    }

I have tried wrapping my JA code (runs in its own thread) in an while(true) loop but that didn't seem to help. Any help would be appreciated. Thanks!

KS7X
  • 332
  • 2
  • 15
  • I believe you need to use `HttpURLConnection` instead of just `URLConnection`, and also call `setRequestMethod("GET")`, to initiate proper HTTP communication, so the servlet container knows, what method of the servlet to call. – Jozef Chocholacek Aug 02 '16 at 19:37
  • 3
    @Jozef: Nope, OP is just looking for push but got basic concepts wrong. KS7X, your servlet is basically responding back to the Java Application (in that `response` variable), not to "the browser page" as you seemed to expect. Which of those is most helpful in solving your problem? http://stackoverflow.com/q/25947790 or http://stackoverflow.com/q/32426674? – BalusC Aug 02 '16 at 20:57
  • Thanks @BalusC, both of those links are giving me a new path to follow in getting my application to work. – KS7X Aug 03 '16 at 21:10

1 Answers1

-1

There are two errors:

  1. First of all, servlet return result string not in browser, but in your JA application.
  2. By using conn.getOutputStream() you implicitly setted request method type to "POST" value, therefore you are have to implement "doPost" method in yout servlet to handle the request.

JA - send request and return response string from servlet:

try {

URL url = new URL("http://(/*ip address*/:8080/FirstServlet/myfirstservlet");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("POST");
conn.setDoOutput(true);
conn.setDoInput(true);


conn.setRequestProperty("Content-Type", "text/html");
BufferedWriter out = new BufferedWriter(new OutputStreamWriter(conn.getOutputStream()));
out.write("testing");
out.flush();
out.close();

BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));

String responsePart;
StringBuilder resultString = new StringBuilder();

while ((responsePart = in.readLine()) != null) {
    resultString.append(responsePart);
}
in.close();

System.out.println("Response from servlet: " + resultString);

} catch (MalformedURLException ex) {
    ex.printStackTrace();
} catch (IOException iex) {
    iex.printStackTrace();
}

S - return string that was sent by JA back to JA:

    protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {

    dummy();
    PrintWriter out = res.getWriter();
    BufferedReader bufferedReader = null;
    StringBuilder stringBuilder = new StringBuilder();
    char test = 'a';

    res.setContentType("text/html");
    try{
        InputStream inputStream = req.getInputStream();

        if (inputStream != null) {
            bufferedReader = new BufferedReader(new InputStreamReader(inputStream));

            char[] charBuffer = new char[128];
            int bytesRead = -1;

            while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
                stringBuilder.append(charBuffer, 0, bytesRead);

            }

            //Return string to JA
            out.println(stringBuilder.toString());

        } else {
            stringBuilder.append("");
            out.println("0");
        }
    } catch (IOException ex) {
        ex.printStackTrace();
    }  
}
Azat
  • 1,048
  • 8
  • 9