2011-01-27 14 views
0

サーブレット(Tomcat 6でホストされている)にjava直列化オブジェクトを送信しようとするアプレットがあります。 URLは正しく、アプレットは正しいサーブレットに到達しますが、サーブレット側で何かを読むことになると、エラーが発生します。ここでサーブレットでシリアル化されたオブジェクトを読み取るときのEOFException

は、アプレットのコードです:ここで


String adresse = "/Applic_ClientsPartners/NewMemberServlet"; 
URL page = getDocumentBase(); 
String protocole = page.getProtocol(); 
String host = page.getHost(); 
int port = page.getPort(); 
System.out.println(protocole + "://" + host + ":" + port + adresse); 
URL serv = new URL(protocole, host, port, adresse); 
URLConnection conn = serv.openConnection(); 
conn.setUseCaches(false); 
conn.setDefaultUseCaches(false); 
//conn.setRequestProperty("Content-Type", "application/x-java-serialized-object"); 
conn.setRequestProperty("Content-Type", "application/octet-stream"); 
conn.setDoInput(true); 
conn.setDoOutput(true); 
System.out.println("Connection open"); 
ObjectOutputStream oos = new ObjectOutputStream(conn.getOutputStream()); 
ObjectInputStream ois = new ObjectInputStream(conn.getInputStream()); 
System.out.println("Envoi de 'test'"); //sending a test String 
String t = "test"; 
oos.writeObject(t); 
System.out.println("test flush"); 
oos.flush(); 
System.out.println("test between flush & writeObject"); 
oos.writeObject(nouveau); //this is a serializable custom object 
oos.flush(); 
//Boolean result = ois.readBoolean(); 
ois.close(); 
oos.close(); 
System.out.println("Streams fermés"); //streams closed successfully 

サーブレットのコードです:


response.setContentType("application/octet-stream"); 
ObjectInputStream ois = new ObjectInputStream(request.getInputStream()); 
ObjectOutputStream oos = new ObjectOutputStream(response.getOutputStream()); 
System.out.println("AVAILABLE " + ois.available()); 
System.out.println("Pré read test"); 
String t = (String) ois.readObject(); 
System.out.println(t + " lu"); 
Cards.Member nouveau = (Cards.Member) ois.readObject(); 
System.out.println("Post read test"); 
oos.close(); 
ois.close(); 
System.out.println("Streams fermés"); //Streams closed successfully 
return; 

私は試してみる...コースの両方を囲むキャッチ(IOExceptionをする例)。エラーは以下の通りです:


java.io.EOFException 
     at java.io.ObjectInputStream$BlockDataInputStream.peekByte(ObjectInputStream.java:2554) 
     at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1297) 
     at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351) 
     at Servlets.NewMemberServlet.doPost(NewMemberServlet.java:96) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
     at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 
     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 
     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
     at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 
     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 
     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298) 
     at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:852) 
     at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588) 
     at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) 
     at java.lang.Thread.run(Thread.java:619) 

私は本当にここに何が起こっているか理解していない:サーブレットのObjectInputStreamのは、何を取得するようだが、私はHTTPトンネルとはいえ、同じWebプロジェクト内の別のアプレット、サーブレットを持って、彼らは完璧に働いていますか?

任意の助けいただければ幸いです:)

+0

例外を発生させるものです.readObjectには2つの呼び出しは()、がありますか? – vz0

+0

標準出力に表示されるテスト出力は何ですか? – biziclop

+0

readObject()を最初に呼び出すと、例外がスローされます。テスト出力はアプレットのすべてが表示されますが、サーブレットは "Préread test"で停止します(readObject()の最初の呼び出しの直前)。お役に立てれば。 – Lupuss

答えて

1

はあなたのObjectOutputStreamにデータを書いた後にのみ、あなたのアプレットでのObjectInputStreamを作成してみてください。サーブレット側では、ObjectOutputStreamの作成を遅らせます。

理由:

私は(それが正しい順序でだ)あなたはそれが動作するはずです書かれているようなコードを考えて、私は私の周りの問題を持っていた知っています過去のこれらのストリーム設定のシーケンスおよびタイミング。

+0

それは働いた!あなたの助けと役に立つリンクをありがとう。オブジェクトは正しく送信され、正しく読み取られます。 – Lupuss

1

サーブレットでは、まずすべての入力処理を行い、その後は出力処理を行います。特に、私のようにあなたのコードの順序を変更したい:

// Read input: 
ObjectInputStream ois = new ObjectInputStream(request.getInputStream()); 
System.out.println("AVAILABLE " + ois.available()); 
System.out.println("Pré read test"); 
String t = (String) ois.readObject(); 
System.out.println(t + " lu"); 
Cards.Member nouveau = (Cards.Member) ois.readObject(); 
System.out.println("Post read test"); 
ois.close(); 

// Write output: 
response.setContentType("application/octet-stream"); 
ObjectOutputStream oos = new ObjectOutputStream(response.getOutputStream()); 
// oos.writeObject(someSerializablebject); 
oos.close(); 
System.out.println("Streams fermés"); //Streams closed successfully 
+0

それは基本的に私が本当にありがとう、ありがとう。 – Lupuss

関連する問題