私はクライアントサーバーアプリケーションを書いています。マルチスレッドサーバーを作成しました。サーバーとクライアントの間で適切に通信する方法を知りたいです。一意の GUID 番号を持つ 2 つのクライアント (2 人のゲーム プレーヤー) がいます (スレッドは同じ名前です)。プレーヤーのスレッドは連携しています。
サーバーは、前のステップでプレイヤーの GUID 番号を既に受け取っています。サーバースレッドは常に機能しています。
ステップに問題があります - プレーヤーの適切な順序を提供する方法です。簡単な例を試しました:
サーバー - GUID (文字列) を送信しています: - 最初に - プレイヤー 1、- 2 番目に - プレイヤー 2。フラグメント :
public class ServerToPlayer implements Runnable //server creates this thread for each player
{
private ObjectOutputStream output;
@Override
public void run()
{
...
while(true)
{
output.writeObject(String.valueOf(localKey1)); //localKey1 - GUID number of Player1
output.writeObject(String.valueOf(localKey2)); //localKey2 - GUID number of Player2
break;
}
}
}
スレッド プレイヤー クラス:
public class Player implements Runnable
{
private ObjectOutputStream output;
private ObjectInputStream input;
private static boolean startPlayer = true;
@Override
public void run()
{
Thread.currentThread().setName(String.valueOf(GUIDPlayer)); // GUIDPlayer
// -
// describes
// player in
// server
// ...
while (true)
{
String guidInput = (String) input.readObject(); // guid from server
if (Thread.currentThread().getName().equals(guidInput))
{
synchronized (this)
{
startPlayer = true;
doMovement(); // proper player is doing sth
startPlayer = false;
notify();
}
} else if (!Thread.currentThread().getName().endsWith(guidInput))
{
synchronized (this)
{
while (true)
{
wait();
if (!startPlayer)
{
break;
}
}
}
}
}
}
}
The question is how to provide thread communication to receive in this example:
1. first iteration: class Player receives localKey1 from server (GUID of player1):
- player1 should be executing, and player2 should wait
2. second iteration: change executing player - class Player receives localKey2 from server (GUID of player2):
- player2 should be executing, and player1 should wait.
このコードを使用すると、player1 は実行中であり、player2 は待機中であり、起動されません。したがって、次のステップも間違っています。同期を改善するには?
私もこの方法でこれをやろうとしました:
if(Thread.currentThread().getName().equals(guidInput))
{
startPlayer = true;
doMovement();
startPlayer = false;
}
else if(!Thread.currentThread().getName().endsWith(guidInput))
{
while(true)
{
Thread.sleep(5000);
if(!startPlayer)
break;
}
}
しかし、このようにブール値の startPlayer は変更されません