2010-04-19 4 views
3

Я следующий код на апплете стороны:java.io.EOFException при записи и чтения froma сервлета

URL servlet = new URL(appletCodeBase, "FormsServlet?form=requestRoom"); 
URLConnection con = servlet.openConnection(); 

con.setDoOutput(true); 
con.setDoInput(true); 
con.setUseCaches(false); 
con.setRequestProperty("Content-Type", "application/octet-stream"); 

ObjectOutputStream out = new ObjectOutputStream(con.getOutputStream()); 
out.writeObject(user);//user is an object of a serializable class 
out.flush(); 
out.close(); 

ObjectInputStream in = new ObjectInputStream(con.getInputStream()); 
status = (String)in.readObject(); 
in.close(); 
if("success".equals("status")) { 
    JOptionPane.showMessageDialog(rootPane, "Request submitted successfully."); 
} else { 
    JOptionPane.showMessageDialog(rootPane, "ERROR! Request cannot be made at this 
    time"); 
} 

В стороне сервлета я получаю код следующим образом:

form = request.getParameter("form"); 
    if("requestRoom".equals(form)) { 
     String fullName, eID, reason; 
     UserRequestingRoom user; 

     try { 
      in = new ObjectInputStream(request.getInputStream()); 
      user = (UserRequestingRoom)in.readObject(); 
      fullName = user.getFullName(); 
      eID = user.getEID(); 
      reason = user.getReason(); 

      Class.forName("com.mysql.jdbc.Driver"); 
      Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/chat_applet","root",""); 
      PreparedStatement statement = con.prepareStatement("INSERT INTO REQCONFROOM VALUES(\"" + fullName + "\",\"" + eID + "\",\"" + reason + "\")"); 
      statement.execute(); 

      out = new ObjectOutputStream(response.getOutputStream()); 
      out.writeObject("success"); 
      out.flush(); 

     } catch (Exception e) { 
      e.printStackTrace(); 
      out = new ObjectOutputStream(response.getOutputStream()); 
      out.writeObject("fail"); 
      out.flush(); 
     } 
    } 

Когда Я нажимаю на кнопку, которая вызывает код на стороне апплета, я получаю следующее сообщение об ошибке:

java.io.EOFException 
    at java.io.ObjectInputStream$PeekInputStream.readFully(Unknown Source) 
    at java.io.ObjectInputStream$BlockDataInputStream.readShort(Unknown Source) 
    at java.io.ObjectInputStream.readStreamHeader(Unknown Source) 
    at java.io.ObjectInputStream.<init>(Unknown Source) 
    at com.org.RequestRoomForm.requestActionPerformed(RequestRoomForm.java:151) 

    **//Line 151 is "ObjectInputStream in..." line in the applet code** 

    at com.org.RequestRoomForm.access$000(RequestRoomForm.java:7) 
    at com.org.RequestRoomForm$1.actionPerformed(RequestRoomForm.java:62) 
    at javax.swing.AbstractButton.fireActionPerformed(Unknown Source) 
    at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source) 
    at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source) 
    at javax.swing.DefaultButtonModel.setPressed(Unknown Source) 
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source) 
    at java.awt.Component.processMouseEvent(Unknown Source) 
    at javax.swing.JComponent.processMouseEvent(Unknown Source) 
    at java.awt.Component.processEvent(Unknown Source) 
    at java.awt.Container.processEvent(Unknown Source) 
    at java.awt.Component.dispatchEventImpl(Unknown Source) 
    at java.awt.Container.dispatchEventImpl(Unknown Source) 
    at java.awt.Component.dispatchEvent(Unknown Source) 
    at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source) 
    at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source) 
    at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source) 
    at java.awt.Container.dispatchEventImpl(Unknown Source) 
    at java.awt.Window.dispatchEventImpl(Unknown Source) 
    at java.awt.Component.dispatchEvent(Unknown Source) 
    at java.awt.EventQueue.dispatchEvent(Unknown Source) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
    at java.awt.EventDispatchThread.run(Unknown Source) 

Почему я получаю эту ошибку? Я покраснел, когда я выхожу, я также закрыл соединения, но получаю ошибку. Любая причина для этого?

+0

Вы отлажена сервлет (или, по крайней мере, сделал несколько выходов журналов) в убедитесь, что вы действительно достигли сервлета и введите блок if? Исходя из исключения на стороне клиента, похоже, что сервлет (или какой-либо другой серверный компонент) ничего не пишет в поток ответов, так что клиент немедленно выходит из строя из-за пустого ответа. – jarnbjo

+0

есть. Он не показывает никаких признаков того, что выполнение достигает сервлета. Во всяком случае, мне пришлось разделить мой сериализуемый obejct и отправить его через URl (через &). Результат слишком груб - очень длинный URL. Но это делает работу в конце. – mithun1538

ответ

10

Закрыть объект ObjectOutputStream в конце.

ObjectOutputStream out = new ObjectOutputStream(con.getOutputStream()); 
out.writeObject(user);//user is an object of a serializable class 
out.flush(); 
out.close(); //Don,t close your out here 

ObjectInputStream in = new ObjectInputStream(con.getInputStream()); 
status = (String)in.readObject(); 
in.close(); 

out.close(); //Close your out after reading the input 
-2

первого request.getParameter()
затем request.getInputStream()

этот случай должен конечно исключение на котом, но не конечно исключение на WebLogic