用于处理applet通信和http请求的Servlet

时间:2010-10-18 12:17:02

标签: java servlets applet stream urlconnection

我正在构建一个解决方案,其中tomcat6上的servlet通过提供jsp网页来处理来自另一台机器的输入。我也喜欢使用相同的servlet与同一台机器上的applet进行通信,以显示一些结果并执行一些任务。

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

有什么想法吗?

编辑:错误讯息:

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

1 个答案:

答案 0 :(得分:2)

那是因为你试图使用ObjectInputStream反序列化servlet的基于文本的响应体,而它根本没有被序列化,你应该使用Reader

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