2016-08-02 28 views
0

Mein Ziel ist es, eine einfache Nachricht von einer Java-Anwendung (JA) an ein Servlet (S) zu senden und auf der Browser-Seite anzuzeigen. Ich würde erwarten, dass jedes Mal, wenn ich die Servlet-Klasse (erfrischende Browser-Seite) ausführen würde, ich die Nachricht erhalten würde.Nachricht von Java-Anwendung an Servlet senden und anzeigen

Ich benutze BufferedWriter, um die Ausgabe auf dem JA und BufferedReader auf dem S zu streamen, um es zu erhalten, aber ich denke, dass ich etwas falsch mache.

Hier ist Code-Schnipsel von 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(); 
     }   

Hier ist der Code von 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(); 
     } 

    } 

ich meine JA Code Einwickeln versucht haben (läuft in einem eigenen Thread) in einer while (true) Schleife, aber das schien nicht zu helfen. Jede Hilfe wäre willkommen. Vielen Dank!

+0

Ich glaube, Sie verwenden müssen ' HttpURLConnection 'anstatt nur' URLConnection', und auch 'setRequestMethod (" GET ")', um die korrekte HTTP-Kommunikation einzuleiten, damit der Servlet-Container weiß, welche Methode des Servlets aufgerufen werden soll. –

+3

@Jozef: Nein, OP ist nur auf der Suche nach Push, aber grundlegende Konzepte falsch verstanden. KS7X, Ihr Servlet antwortet grundsätzlich auf die Java-Anwendung (in dieser Antwortvariable), nicht auf die Browserseite, wie Sie es erwartet haben. Welche davon ist am hilfreichsten bei der Lösung Ihres Problems? http://stackoverflow.com/q/25947790 oder http://stackoverflow.com/q/32426674? – BalusC

+0

Dank @BalusC, diese beiden Links geben mir einen neuen Weg, um meine Anwendung zum Laufen zu bringen. – KS7X

Antwort

-1

Es gibt zwei Fehler:

  1. Zu allerersten Servlet Rückergebnis String nicht in Browser, aber in Ihrer JA Anwendung.
  2. Durch Verwendung von conn.getOutputStream() haben Sie implizit den Anforderungsmethodentyp auf "POST" gesetzt, daher müssen Sie die Methode "doPost" in Ihrem Servlet implementieren, um die Anfrage zu bearbeiten.

JA - Anfrage senden und Antwortstring von Servlets zurück:

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 - Rückkehr Zeichenfolge, die von JA zurück zu JA gesendet wurde:

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(); 
    } 
}