【发布时间】:2010-10-18 12:17:02
【问题描述】:
我正在构建一个解决方案,其中tomcat6 上的servlet 通过提供一个jsp 网页来处理来自另一台机器的输入。我还希望同一个 servlet 与同一台机器上的小程序通信,以显示一些结果并执行一些任务。
我可以使用 URLConnection 从小程序连接到 servlet,但是当从 servlet 接收消息时,我从小程序收到“无效的流标头”异常消息。
有什么想法吗?
编辑:错误信息:
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);
}
【问题讨论】:
-
看起来你处理 POST(doPost) 的 servlet 应该处理一个序列化的对象,而你的 URLConnection 将发送一个 get (并最终在 doGet 中) - 或者是故意的?
标签: java servlets applet stream urlconnection