将消息从Java应用程序发送到servlet并显示

将消息从Java应用程序发送到servlet并显示,java,html,apache,servlets,bufferedreader,Java,Html,Apache,Servlets,Bufferedreader,我的目标是从Java应用程序(JA)向servlet发送一条简单消息,并将其显示在浏览器页面上。我希望每次运行servlet类(刷新浏览器页面)时,都会收到消息 我使用BufferedWriter在JA上传输输出,使用S上的BufferedReader接收输出,但我猜我做错了什么 以下是JA的代码片段: try{ URL url = new URL("http://(/*ip address*/:8080/FirstServlet/myfirstservlet");

我的目标是从Java应用程序(JA)向servlet发送一条简单消息,并将其显示在浏览器页面上。我希望每次运行servlet类(刷新浏览器页面)时,都会收到消息

我使用BufferedWriter在JA上传输输出,使用S上的BufferedReader接收输出,但我猜我做错了什么

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

    }
我已经尝试过在while(true)循环中包装我的JA代码(在它自己的线程中运行),但这似乎没有帮助。任何帮助都将不胜感激。谢谢

有两个错误:

  • 首先,servlet返回的结果字符串不是在浏览器中,而是在JA应用程序中
  • 通过使用conn.getOutputStream()将请求方法类型隐式设置为“POST”值,因此必须在servlet中实现“doPost”方法来处理请求
  • JA-从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-JA发送回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();
        }  
    }
    

    我相信您需要使用
    HttpURLConnection
    ,而不仅仅是
    URLConnection
    ,还需要调用
    setRequestMethod(“GET”)
    ,来启动正确的HTTP通信,这样servlet容器就知道要调用servlet的哪个方法了。@Jozef:Nope,OP只是在寻找push,但基本概念是错误的。KS7X,您的servlet基本上是响应Java应用程序(在该
    response
    变量中),而不是您所期望的“浏览器页面”。以下哪项对解决您的问题最有帮助?或者?谢谢@BalusC,这两个链接都给了我一条让我的应用程序正常运行的新途径。