2012-05-11 4 views
0

私はサーバー/クライアントプログラムを作成しています。クライアントは、この目的のために設計されたオブジェクトである「要求」をサーバーに送信し、サーバーはObjectInputStreamを使用してそれらをデコードします。すべての「要求」オブジェクトは同じクラスであり、データフィールドだけが異なります。
通常はすべて動作します。しかし、いくつかの特定の状態(おそらく、Requestオブジェクトが200 KB以上ではなく、少し大きめの場合)では、サーバ側のreadObject()は例外なくブロックされます。
特定のオブジェクトに対するreadObject()のブロック

サーバコード:

public class ConnectionThread extends Thread { 

    Socket con; 
    Request request; 

    public ConnectionThread(Socket s) { 
     con = s; 
     try { 
      ObjectInputStream in = new ObjectInputStream(con.getInputStream()); 
      // Works till here; the object "in" is initialized. 
      request = (Request) in.readObject(); 
      // This line is not reached, in particular cases. 
     } catch (ClassNotFoundException ex) { 
      Logger.getLogger(ConnectionThread.class.getName()).log(Level.SEVERE, null, ex); 
     } catch (IOException ex) { 
      Logger.getLogger(ConnectionThread.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

... 
} 

クライアントコード:

public static void saveStoreDataForTable(DataTable tb) { 
    try { 
     Socket s = new Socket("localhost", portNo); 
     ObjectOutputStream out = new ObjectOutputStream(s.getOutputStream()); 
     out.writeObject(new Request("saveStoreData", 
       new Object[] 
       {tb.getEdited(), tb.getRemoved(), tb.getNewTables(), tb.getAlterations()})); 
     out.flush(); 
     // These lines work. But I can't get servers respone; again, in some particular cases. 
... 
} 
+0

ここに必要なのは、あなたが考えていない他の例外を捕まえるためのExceptionのキャッチです。 in.readObject()が "Request"型のオブジェクトを返さない可能性があります。 –

+0

'readObject()'は '特定のオブジェクトをブロックしません'。受信するデータがない場合はブロックします。 – EJP

答えて

1

あなたはそのI /スタートにコンストラクタからO()メソッドを移動する必要があります。現時点では、このスレッドを構築するスレッドでI/Oを実行していますが、これはほぼ間違ったスレッドです。

関連する問題