java - Servlet 处理 applet 通信和 http 请求

标签 java servlets applet stream urlconnection

我正在构建一个解决方案,其中 tomcat6 上的 servlet 通过提供 jsp 网页来处理来自另一台计算机的输入。我还希望同一个 servlet 与同一台计算机上的小程序进行通信,以显示一些结果并执行一些任务。

我可以使用 URLConnection 从 applet 连接到 servlet,但是当从 servlet 接收消息时,我从 applet 收到“无效的流 header ”异常消息。

有什么想法吗?

编辑:错误消息:

java.io.StreamCorruptedException: invalid stream header: 0A0A0A3C at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:783) at java.io.ObjectInputStream.<init>(ObjectInputStream.java:280) at applet.viewApplet.onSendData(viewApplet.java:126)

小程序代码:

 private URLConnection getServletConnection()
        throws MalformedURLException, IOException {

    // Open the servlet connection
    URL urlServlet = new URL("http://localhost:8080/Servlet");
    connection = urlServlet.openConnection();

    // Config
    connection.setDoInput(true);
    connection.setDoOutput(true);

    connection.setUseCaches (false);
    connection.setDefaultUseCaches (false);

    connection.setRequestProperty(
            "Content-Type",
            "application/x-java-serialized-object");

    return connection;
}

private void onSendData() {
    try {
        // get input data for sending
        String input = "Applet string heading for servlet";

        // send data to the servlet
        connection = getServletConnection();
        OutputStream outstream = connection.getOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(outstream);
        oos.writeObject(input);
        oos.flush();
        oos.close()

        // receive result from servlet
        InputStream instr = connection.getInputStream();
        ObjectInputStream inputFromServlet = new ObjectInputStream(instr);
        String result = (String) inputFromServlet.readObject();
        inputFromServlet.close();
        instr.close();

        // show result
        textField.setText(result);

    } catch (java.net.MalformedURLException mue) {
        textField.setText("Invalid serlvetUrl, error: " + mue.getMessage());
    } catch (java.io.IOException ioe) {
        textField.setText("Couldn't open a URLConnection, error: " + ioe.getMessage());
    } catch (Exception e) {
        textField.setText("Exception caught, error: " + e.getMessage());
    }
}

Servlet 代码:

public class Servlet extends HttpServlet {

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    response.setContentType("text/html;charset=ISO-8859-1");
    PrintWriter out = response.getWriter();
    String defect = request.getParameter("defect").toString();

    try {
        out.println("<html>");
        out.println("<head>");
        out.println("<title>Servlet</title>");
        out.println("</head>");
        out.println("<body>");
        out.println("<h1>Servlet at " + request.getContextPath() + "</h1>");
        out.println("<p>Defect: " + defect + "</p>");
        out.println("</body>");
        out.println("</html>");
    } finally {
        out.close();
    }
}

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    processRequest(request, response);
}

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {

    try {
        response.setContentType("application/x-java-serialized-object");

        InputStream in = request.getInputStream();
        ObjectInputStream inputFromApplet = new ObjectInputStream(in);

        String servletText = "Text from Servlet";

        // echo it to the applet
        OutputStream outstr = response.getOutputStream();
        ObjectOutputStream oos = new ObjectOutputStream(outstr);
        oos.writeObject(servletText);
        oos.flush();
        oos.close();

    } catch (Exception e) {
        e.printStackTrace();
    }

    processRequest(request, response);
}

最佳答案

这是因为您尝试使用 ObjectInputStream 反序列化 servlet 的基于文本的响应正文,而它根本没有序列化,您应该使用 Reader这个。

长话短说:How to fire and handle HTTP requests using URLConnection? .

关于java - Servlet 处理 applet 通信和 http 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3959014/

相关文章:

java - 文件提供者 : Failed to find configured root

jsf - 使用 Servlet 3.0 以编程方式控制登录

java servlets 响应 - 保持在同一页面上

java - 通过套接字传输动画 GIF

java - 如何在同一个网页中的小程序之间共享数据?

java - 如何将 Hibernate Blob 转换回原始文件

java - Java Swing 对象静态初始化的首选习惯用法?

java - Java 6 中IdentityHashMap 的实际使用

servlets - servlet 3.0 @WebServlet 使用..web.xml 中会有什么?

java - 如何导出java小程序