Je construis une solution où une servlet sur tomcat6 gère les entrées d'une autre machine en fournissant une page web jsp. J'aimerais aussi que la même servlet communique avec une applet sur la même machine pour afficher des résultats et effectuer quelques tâches.Servlet pour gérer à la fois la communication par applet et les requêtes http
Je peux me connecter de l'applet à la servlet en utilisant une URLConnection mais quand je reçois un message de la servlet, j'obtiens un message d'exception "header de flux invalide" de l'applet.
Des idées?
modifier: Message d'erreur:
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)
Code Applet:
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());
}
}
Code 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);
}
On dirait que votre servlet pour gérer POST (doPost) est censé gérer un objet sérialisé alors que votre URLConnection enverra un get (et finira dans doGet) - ou est-ce prévu? – nos