【问题标题】:Sending message from Java application to servlet and displaying it [duplicate]从Java应用程序发送消息到servlet并显示它[重复]
【发布时间】:2016-12-08 03:49:57
【问题描述】:

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

我使用 BufferedWriter 在 JA 上流式传输输出,并在 S 上使用 BufferedReader 来接收它,但我想我做错了什么。

这是来自 JA 的代码 sn-p:

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

    }

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

【问题讨论】:

  • 我相信你需要使用HttpURLConnection而不是仅仅使用URLConnection,并且还要调用setRequestMethod("GET"),来发起正确的HTTP通信,这样servlet容器就知道,调用servlet的什么方法.
  • @Jozef:不,OP 只是在寻找推送,但基本概念有误。 KS7X,您的 servlet 基本上是响应 Java 应用程序(在那个 response 变量中),而不是您似乎期望的“浏览器页面”。其中哪一个对解决您的问题最有帮助? stackoverflow.com/q/25947790stackoverflow.com/q/32426674?
  • 感谢@BalusC,这两个链接都为我提供了一条让我的应用程序正常工作的新途径。

标签: java html apache servlets bufferedreader


【解决方案1】:

有两个错误:

  1. 首先,servlet 不是在浏览器中返回结果字符串,而是在您的 JA 应用程序中。
  2. 通过使用 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();
    }  
}

【讨论】:

    猜你喜欢
    • 2011-08-28
    • 2018-06-04
    • 2015-04-17
    • 2021-02-10
    • 2015-06-07
    • 2017-03-31
    • 1970-01-01
    • 1970-01-01
    • 2011-03-16
    相关资源
    最近更新 更多