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.
...
}
ここに必要なのは、あなたが考えていない他の例外を捕まえるためのExceptionのキャッチです。 in.readObject()が "Request"型のオブジェクトを返さない可能性があります。 –
'readObject()'は '特定のオブジェクトをブロックしません'。受信するデータがない場合はブロックします。 – EJP