Это моя вторая попытка решить эту проблему. Моя первая попытка была здесь , но, возможно, мое объяснение моей проблемы было недостаточным, моя проблема заключалась в том, что апплет получил исключение:
java.io.StreamCorruptedException: invalid stream header: 0A0A0A3C at
java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:783) at
java.io.ObjectInputStream.<init>(ObjectInputStream.java:280)
извините, если я звучу как испорченная запись:)
Я пытаюсь установить связь между апплетом и сервлетом на одном компьютере. Я создал сервлет в Netbeans, создав новый проект - веб-приложение Java - и выбрав Glassfish Server 3 в качестве сервера. Он создает index.jsp, но мне не нужен интерфейс веб-страницы.
Я запускаю сервлет из NetBeans (нажимая клавишу f6), и он развертывается и открывает файл index.jsp сервлета в моем браузере. Затем я запускаю апплет (из другого проекта в Netbeans) и пытаюсь подключиться. Я до сих пор получаю добрый старый «недопустимый заголовок потока», поэтому я предполагаю, что ошибка кроется в том, что я сделал в Netbeans.
Я вставил некоторый код, который, как я полагаю, работает (старый код, но не нашел более полных примеров). Код явно украден у Ссылка
Итак, в конце я хотел бы отправить массив двухмерных объектов из сервлета в апплет, когда апплет запрашивает отправку массива. Примеры кода просто показывают неверный заголовок потока, который я получаю.
Я думаю / думаю, что апплет получает текстовый ответ от сервера, но я хочу, чтобы ответ был сериализованным объектом (просто строкой в примере кода), это будет Object [] [] позже, если Я когда-нибудь получаю подсказку.
Спасибо за ваше терпение, гуру. :)
Код апплета (не стесняйтесь игнорировать init () со всем кодом макета):
package se.iot.recallapplet;
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.net.*;
public class RecallApplet extends Applet {
private TextField inputField = new TextField();
private TextField outputField = new TextField();
private TextArea exceptionArea = new TextArea();
public void init() {
// set new layout
setLayout(new GridBagLayout());
// add title
Label title = new Label("Echo Applet", Label.CENTER);
title.setFont(new Font("SansSerif", Font.BOLD, 14));
GridBagConstraints c = new GridBagConstraints();
c.gridwidth = GridBagConstraints.REMAINDER;
c.weightx = 1.0;
c.fill = GridBagConstraints.HORIZONTAL;
c.insets = new Insets(5, 5, 5, 5);
add(title, c);
// add input label, field and send button
c = new GridBagConstraints();
c.anchor = GridBagConstraints.EAST;
add(new Label("Input:", Label.RIGHT), c);
c = new GridBagConstraints();
c.fill = GridBagConstraints.HORIZONTAL;
c.weightx = 1.0;
add(inputField, c);
Button sendButton = new Button("Send");
c = new GridBagConstraints();
c.gridwidth = GridBagConstraints.REMAINDER;
add(sendButton, c);
sendButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
onSendData();
}
});
// add output label and non-editable field
c = new GridBagConstraints();
c.anchor = GridBagConstraints.EAST;
add(new Label("Output:", Label.RIGHT), c);
c = new GridBagConstraints();
c.gridwidth = GridBagConstraints.REMAINDER;
c.fill = GridBagConstraints.HORIZONTAL;
c.weightx = 1.0;
add(outputField, c);
outputField.setEditable(false);
// add exception label and non-editable textarea
c = new GridBagConstraints();
c.anchor = GridBagConstraints.EAST;
add(new Label("Exception:", Label.RIGHT), c);
c = new GridBagConstraints();
c.gridwidth = GridBagConstraints.REMAINDER;
c.weighty = 1;
c.fill = GridBagConstraints.BOTH;
add(exceptionArea, c);
exceptionArea.setEditable(false);
}
/**
* Get a connection to the servlet.
*/
private URLConnection getServletConnection()
throws MalformedURLException, IOException {
// Connection zum Servlet ˆffnen
URL urlServlet = new URL("http://localhost:8080/Event_Servlet/");
URLConnection con = urlServlet.openConnection();
// konfigurieren
con.setDoInput(true);
con.setDoOutput(true);
con.setUseCaches(false);
con.setRequestProperty(
"Content-Type",
"application/x-java-serialized-object");
return con;
}
/**
* Send the inputField data to the servlet and show the result in the outputField.
*/
private void onSendData() {
try {
// get input data for sending
String input = inputField.getText();
// send data to the servlet
URLConnection con = getServletConnection();
OutputStream outstream = con.getOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(outstream);
oos.writeObject(input);
oos.flush();
oos.close();
// receive result from servlet
InputStream instr = con.getInputStream();
ObjectInputStream inputFromServlet = new ObjectInputStream(instr);
String result = (String) inputFromServlet.readObject();
inputFromServlet.close();
instr.close();
// show result
outputField.setText(result);
} catch (Exception ex) {
ex.printStackTrace();
exceptionArea.setText(ex.toString());
}
}
}
Код сервлета:
package se.iot.eventservlet;
import java.io.*;
import javax.servlet.ServletException;
import javax.servlet.http.*;
public class Event_Servlet extends HttpServlet {
public void doPost(
HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
try {
response.setContentType("application/x-java-serialized-object");
// read a String-object from applet
// instead of a String-object, you can transmit any object, which
// is known to the servlet and to the applet
InputStream in = request.getInputStream();
ObjectInputStream inputFromApplet = new ObjectInputStream(in);
String echo = (String) inputFromApplet.readObject();
// echo it to the applet
OutputStream outstr = response.getOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(outstr);
oos.writeObject(echo);
oos.flush();
oos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
StackTrace:
java.io.StreamCorruptedException: invalid stream header: 0A0A0A3C
at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:783)
at java.io.ObjectInputStream.<init>(ObjectInputStream.java:280)
at se.iot.recallapplet.RecallApplet.onSendData(RecallApplet.java:114)
at se.iot.recallapplet.RecallApplet.access$000(RecallApplet.java:12)
at se.iot.recallapplet.RecallApplet$1.actionPerformed(RecallApplet.java:48)
at java.awt.Button.processActionEvent(Button.java:392)
at java.awt.Button.processEvent(Button.java:360)
at java.awt.Component.dispatchEventImpl(Component.java:4714)
at java.awt.Component.dispatchEvent(Component.java:4544)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:635)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:296)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:211)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:196)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:188)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)