1

私はクライアントサーバーアプリケーションを書いています。マルチスレッドサーバーを作成しました。サーバーとクライアントの間で適切に通信する方法を知りたいです。一意の 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 は変更されません

4

1 に答える 1

0

以下を含むいくつかのポイント:

while(true) {
   output.writeObject(String.valueOf(localKey1)); //localKey1 - GUID number of Player1 
   output.writeObject(String.valueOf(localKey2)); //localKey2 - GUID number of Player2 
   break;
} 

breakループがwhile完全に無意味にbreakなり、ループが終了することはなく、多くの文字列が非常に高速に送信されます。

変数に関する問題に関連して、キーワードstartPlayerについて読むことをお勧めします。volatile

プレイヤーが順番に行動するようにしたい場合は、他のプレイヤーが行動していないときにサーバーからプレイヤーに制御を渡し、プレイヤーが終了したらプレイヤーからサーバーに戻る必要があります。

于 2013-11-03T18:59:51.757 に答える