サーバーでホストされているメインのゲームロジックを備えたイベントベースの構造を持つゲームに取り組んでいます。現在、ちょうど 2 人の参加者間で 1 つのゲームのみをホストできる非常に小さな機能セットです。私はさまざまな質問を読みましたがServerSocket
、どれも私の質問に答えていません。私はすでに見てみました
- ServerSocket の受け入れが引き続きブロックされます
- ServerSocket.accept()
- Java ServerSocket は、受け入れたソケットで close() が呼び出されるまで、新しい接続を受け入れません。
- ServerSocket の accept() メソッド
私のプロジェクトでは、 と を利用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 つのソケットを配列に割り当てる方法は省略しましたが、例外がないため、ソケットを保持することが機能します。説明されている動作の原因は何かわかりますか? 前もって感謝します。