- PR -

Servlet Application間プログラム(EOFException)

投稿者投稿内容
ゆ〜いち
会議室デビュー日: 2004/03/01
投稿数: 8
投稿日時: 2004-04-22 18:55

ゆ〜いちです。

次のようなソースを書いているのですが、Servlet側の☆部分ででEOF Exception
が発生してしまいます。ネット上で検索など行って対処を行ったつもりなのですが、
方法がわかりません。ご教授いただけませんでしょうか?

#BufferdInputStreamなど試したのですが、同様にEOFExceptionを発生します...

環境としてはWindows 2000上でTomcat(4.1.30)を単独で動かしている状態です。

-- Servlet側

public void service(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
try{
   System.out.println("Starting request!!!");
   ObjectInputStream ois = new ObjectInputStream(request.getInputStream()); ----- ☆

   //CLASSPATHにオブジェクトが含まれていない場合CLASSNOTFOUNDが発生するはず…
   Object capsule = ois.readObject();

   // Objectに処理を実行。加工する。そのデータを返す。

   // ここから応答を作成する。
   response.setContentType("application/octet-stream");
   ObjectOutputStream oos = new ObjectOutputStream(response.getOutputStream());
   oos.writeObject(capsule);
   oos.flush();
   oos.close();
  }catch(ClassNotFoundException cnfEx){
   ServletException sEx = new ServletException("TransactionController:service:CLASS NOT FOUND EXCEPTION occured... ");
throw sEx;
}catch(Exception ex){

ServletException sEx = new ServletException("TransactionController:service:EXCEPTION occured... " + ex.toString());
throw sEx;
}
}

-- Application側

public static void main(String[] args) {
 try{
  URL url = new URL("http://localhost:8080/control");
  System.err.println("接続開始");
  URLConnection conn = url.openConnection();

  Object obj = new Object();
  writeObject(conn,obj);
  Object recObj = readObject(conn);
 }catch(IOException ioex){
  System.err.println(ioex.toSring());
 }catch(Exception ex){
  System.err.println(ex.toSring());
 }
}
 private void writeObject(URLConnection conn, Object capsule) throws IOException, Exception{
 try{
  conn.setUseCaches(false);
  conn.setRequestProperty("CONTETN_TYPE", "application/octet-stream");
  conn.setDoInput(true);
  conn.setDoOutput(true);
  ObjectOutputStream oos = new ObjectOutputStream(conn.getOutputStream());
  System.out.println("Writing Object...");
  oos.writeObject(capsule);
  oos.flush();
  oos.close();
 }catch(IOException ioex){
  throw ioex;
 }catch(Exception ex){
  throw ex;
 }
}
private Object readObject(URLConnection conn) throws ClassNotFoundException, IOException, Exception{
Object capsule = null;
try{
ObjectInputStream ois = new ObjectInputStream(conn.getInputStream());
System.out.println("waiting response");
capsule = ois.readObject();
ois.close();

}catch(ClassNotFoundException cnfEx){
throw cnfEx;
}catch(IOException ioex){
throw ioex;
}catch(Exception ex){
throw ex;
}
return capsule;
}
K
大ベテラン
会議室デビュー日: 2004/04/07
投稿数: 174
投稿日時: 2004-04-22 20:40
詳しいことはわからないので参考までに。

クライアント側に問題があると思います。
Servletが受け付けるリクエストはHTTP(POSTまたはGET)ですから、ぜんぜん関係ない
データを送りつけられてもちゃんと受け取ることができないのではないでしょうか?
Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 2004-04-23 00:29
ゆ〜いちさん、こんにちは。

なんとか助けてあげたいのですが、
引用:

ネット上で検索など行って対処を行ったつもりなのですが、方法がわかりません。


これの意味が理解できません。

『ネット上で検索など行ったが、方法がわからず、対処できません。』
とか、
『ネット上での検索の方法がわからず、対処できません。』
ならわかるのですが。

まず、その辺がきちんとできないと、問題を解決することは難しいでしょう。

※ HttpServletが受け付けるリクエストは POST, GETだけではありません。
K
大ベテラン
会議室デビュー日: 2004/04/07
投稿数: 174
投稿日時: 2004-04-23 00:52
引用:

※ HttpServletが受け付けるリクエストは POST, GETだけではありません。


たしかにHTTPの他のリクエスト(PUT,HEAD,DELETE)も実装クラスでメソッドが正しくオーバーライドされていれば正しく処理されるでしょうね。
ゆ〜いちさんのクライアントが送信しているのはそもそもHTTPではないので無理だと思うのですが。

サーブレットではなく普通にServerSocketで実装すれば問題なく動くでしょうね。
サーブレットでなければ駄目なのですか?
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2004-04-23 05:59
unibon です。こんにちわ。

動いてもよさそうな気がするのですが、なにか足りないか変なのでしょうね。
いきなり ObjectInputStream/ObjectOutputStream を使うよりも、まずは InputStream/OutputStream に対してバイト単位のバイナリーを書き・読み、をしてみてうまくいくか試されてはどうでしょうか。ストリームを介してバイナリーの書き・読みができれば、あとは ObjectInputStream/ObjectOutputStream でラップするだけです。

引用:

ゆ〜いちさんの書き込み (2004-04-22 18:55) より:
  conn.setRequestProperty("CONTETN_TYPE", "application/octet-stream");


とりあえず、ここ、綴りが違っています("CONTETN_TYPE" ではなく "CONTENT_TYPE" ?)。あまり関係はなさそうですが。
Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 2004-04-23 08:00
Httpでクライアント→サーバに任意のストリーム送りたいなら、PUTメソッド
を使用します。

あと、リクエストヘッダとコンテンツを意識して使用することが必要です。

どうしても、俺仕様のクライアント・サーバにしたければ、
HttpServletではなく、Servletをサブクラス化するべきです。
リクエストヘッダの形式すら HTTPと全く違うものを使用することも
できますが、その場合は Tomcatでなく ServletContainerも
作り直す必要があります。
ゆ〜いち
会議室デビュー日: 2004/03/01
投稿数: 8
投稿日時: 2004-05-09 12:13
ゆ〜いちです。

返事が遅くなりまことに申し訳ありませんでした。Lotus Notes R5と連携させる
必要があり(JDK 1.1.x環境)、任意のストリームメソッドを送って処理を実現させ
る必要があり、四苦八苦していました。

皆様の意見から、少し設計コードを見直し、処理の変更を実装させていただきまし
た。いろいろとご迷惑をおかけしまことに申し訳ありませんでした。今後ともご指
導いただけましたら幸いです。


ranran
会議室デビュー日: 2005/01/09
投稿数: 18
投稿日時: 2005-06-13 00:54
はじめまして、RanRanです

私も同じ様なエラーを遭遇してしまいまして、全然解決できないです。
ぜひ教えてください。

環境は
Apache1.3.33+TOMCAT5.5.9+Java JDK1.5.0_03
Linux RedHat9 (Server)
WindowsXP (Client)
です。
一般的なServletは動くことが確認されています。

以下のようにAppletの中に
getInputStream()がEOFExceptionが発生しています。

よろしく、ご指導をお願いします。

--------------- Applet
     URL codeBase=getCodeBase();
url=new URL(codeBase.getProtocol(),codeBase.getHost(),8080,servlet);
con=url.openConnection();
con.setRequestProperty("CONTENT-TYPE","application/octet-stream");
con.setUseCaches(false);
con.setDoInput(true);
con.setDoOutput(true);

oos=new ObjectOutputStream(con.getOutputStream());
outputProc(oos,command);//objEventSource);
oos.flush();

InputStream is=null;
try{
is=con.getInputStream();
} catch(EOFException e){
// <<<<<<<<<<<<<<<<<<<<<<< ここでエラー
}
ois=new ObjectInputStream(is);
inputProc(ois);
oos.close();
ois.close();

------------ Servlet
public void service(HttpServletRequest request,
HttpServletResponse response)
throws ServletException,IOException{
ObjectInputStream objIn=new ObjectInputStream(request.getInputStream());
response.setContentType("application/octet-stream");
ObjectOutputStream objOut=new ObjectOutputStream(response.getOutputStream());

invokeInput(objIn); // input process
synchronized(this){
invokeOutput(objOut); // output process
}
objOut.flush();
objIn.close();
objOut.close();
}

スキルアップ/キャリアアップ(JOB@IT)