0

サーバーでホストされているメインのゲームロジックを備えたイベントベースの構造を持つゲームに取り組んでいます。現在、ちょうど 2 人の参加者間で 1 つのゲームのみをホストできる非常に小さな機能セットです。私はさまざまな質問を読みましたがServerSocket、どれも私の質問に答えていません。私はすでに見てみました

私のプロジェクトでは、 と を利用ObjectInputStreamしてObjectOutputStreamいます。すべてが期待どおりに機能します (サーバー側とクライアント側の両方で受信/送信) が、両方のソケットが登録された後、同じコードが以前に呼び出されたとしてもaccept、インスタンスのメソッドはServerSocket永久にブロックし続けます。おそらく、一度ソケットを介して通信した後に現れる問題でしょうか?

サーバーログには次のように表示されます。

受け入れを待つ
最初のソケットを 受け入れる対戦相手 を待つことを通知するため に
socket1 にイベントを送信 する



ログに応答イベントが送信されたことが示されている場合、それらはクライアント側で適切に受信および処理されています。クライアント側のデバッグ出力は、次のイベントが確実に送信されたことを示しています。たぶん、クライアントソケットを閉じないことです(3番目のリンクされた質問で言及されています)?とにかく、それ以上の通信が不可能になるため、クライアント ソケットを閉じることができません。

クライアント側のコード

public void send(Event e) {
    try {
        ObjectOutputStream out = new ObjectOutputStream(
                socket.getOutputStream());
        out.writeObject(e);
        out.flush();
        log.debug("sending event... "+e);
    }
    catch(IOException ioe) {
        log.fatal("constructing oos failed", ioe);
    }
}

サーバー側コード

@Override
public void run() {
    running = true;
    while(running) {
        try {
            Socket s = socket.accept();
            ObjectInputStream ois = new ObjectInputStream(s.getInputStream());
            Event event = (Event) ois.readObject();

            try {
                Event[] response = controller.consume(event);
                ObjectOutputStream oos = new ObjectOutputStream(sockets[0].getOutputStream());
                oos.writeObject(response[0]);
                oos.flush();
                ObjectOutputStream oos2 = new ObjectOutputStream(sockets[1].getOutputStream());
                oos2.writeObject(response[1]);
                oos2.flush();
            }
            catch(...) {
                // multiple catch clauses for different exceptions
                // all just logging (nothing passes silently!)
            }
    }
}

Socket[]簡略化のため、2 つのソケットを配列に割り当てる方法は省略しましたが、例外がないため、ソケットを保持することが機能します。説明されている動作の原因は何かわかりますか? 前もって感謝します。

4

1 に答える 1

1

このメソッドは、新しい接続acceptのみを受け入れます。サーバーに接続しようとしているクライアントが 2 つしかないため、3 回目の の呼び出しで無期限にハングします。accept

補足: 新しい と を継続的に作成する必要はありませObjectInputStreamObjectOutputStream。それぞれに対して 1 つだけ作成Socketし、それらへの参照を保持して再利用することができます。

于 2012-04-05T22:51:12.620 に答える