0

サーバー/クライアントプログラムを書いています。クライアントは「リクエスト」(この目的のために設計されたオブジェクト) をサーバーに送信し、サーバーは ObjectInputStream を使用してそれらをデコードします。すべての「リクエスト」オブジェクトは同じクラスで、データ フィールドが異なるだけです。
通常はすべて機能します。しかし、いくつかの特定の状態 (おそらく Request オブジェクトが少し大きいとき、ただし 200 kb を超えないとき) では、サーバー側の 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.
...
}
4

1 に答える 1

1

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

于 2012-05-13T01:37:40.580 に答える