1

解決策が見つかりました(7時間前に自分の質問に答えることができないため、これを閉じて回答したと考えてください)。不要なSocketインスタンスを残していたため、clienアプリがハングしました。ご迷惑をおかけして申し訳ありません。問題を探して走り回るのを手伝ってくれてありがとう=)愛してるよ!

私はこの「問題」の解決策を見つけようとしています。銀行の複数の支店間の銀行振替をシミュレートする必要がある銀行シミュレーションアプリケーションがあります。私は現在、クライアントのコネクタオブジェクトによってキャッチされたさまざまなイベントオブジェクトをディスパッチするイベントバスを使用しています。クライアントが受信したイベントをリッスンすると、コマンドオブジェクトが呼び出され、更新する必要があるものは何でも更新されます(全体像を把握できるようにするため)。

なんらかの理由で理解できません。最初のクライアントインスタンスは正常に開き、期待どおりに動作しますが、最初のインスタンスの後に開かれたクライアントインスタンスは、次の行でハングします(変数は初期化される前に宣言されます)。

try {
        s = new Socket(ip, port);
        System.out.println("Creating out stream");

        oos = new ObjectOutputStream(s.getOutputStream());
        oos.flush();
        System.out.println("Flushed data...");

        ois = new ObjectInputStream(s.getInputStream());

        //Below never gets printed on second client instance *sigh*
        System.out.println("HURRAY");
        readStream = new ReadEventFromStream(ois, this);
    } catch(IOException ioe) {
        ioe.printStackTrace();
        System.out.println("Can't connect to server.");
        System.exit(1);
    }

例外はスローされず、何もありません... 2番目、3番目、...起動されたインスタンスは、これらの非常に単純な行を通過することはありません。ご存知のとおり、上記のコードは、クライアントのmain関数によってインスタンス化されたEventBusConnector(...)オブジェクトで呼び出されます。前述のように、コマンドオブジェクトを使用するReadEventFromStreamクラスは次のとおりです。

class ReadEventFromStream extends Thread {
private ObjectInputStream ois;
private EventBusConnector eventBusConn;
public ReadEventFromStream(ObjectInputStream ois, EventBusConnector eventBusConn) {
    this.ois = ois;
    this.eventBusConn = eventBusConn;
}

@Override
public void run() {
    while(true) {
        try {
            Object o = ois.readObject();
            if (eventBusConn.listensToEvent(o)) {
                Command command;
                if( o instanceof EventBranchListUpdate ) {
                    EventBranchListUpdate event = (EventBranchListUpdate) o;
                    command = new UpdateBranchListCommand(event, EventBusConnector.branch);
                    command.execute();
                } else if ( o instanceof EventNewBranch ) {
                    EventNewBranch event = (EventNewBranch) o;
                    command = new NewBranchCommand(event, this.eventBusConn);
                    command.execute();
                } else if( o instanceof EventMoneyTransfer ) {
                    EventMoneyTransfer event = (EventMoneyTransfer) o;
                    command = new MoneyTransferCommand(event, EventBusConnector.branch);
                    command.execute();
                }
            }
        }
        catch(Exception e) {
            e.printStackTrace();
        }
    }
}

}

だから、うーん...ええ...私はこれに何時間も頭をぶつけてきました、そして私はこれに夢中になっているので本当に助けが必要です。さらにコードが必要な場合は、貼り付けます。ありがとう=)

4

2 に答える 2

1

接続ごとにどこにスレッドを作成しますか?

接続ごとにスレッドを作成しない限り、新しい接続は最後の接続が終了するまで何もしません。

于 2011-06-27T14:52:13.177 に答える
0

まあ...8時間のハードデバッグの後、問題は私の小さな自分にあることがわかりました。クライアントアプリケーションによって呼び出されたクラスの隠されたコーナーのどこかに、不要なソケットインスタンスをローミングしたままにしていたので、ハングしました。ご迷惑をおかけして申し訳ありませんが、コードを記述していないときにデバッグする複雑なアプリケーションであることがわかっていたため、投稿するのに8時間かかりました。

于 2011-06-28T20:49:46.953 に答える