2013-11-03 85 views
1

我一直在編寫客戶端 - 服務器應用程序。我創建了多線程服務器。我不知道如何正確地進行服務器和客戶端之間的通信。有兩個客戶端(2個遊戲玩家)擁有唯一的GUID號碼(線程命名相同)。玩家線程正在一起工作。java多線程服務器客戶端通訊

服務器已在上一步中收到播放器GUID號碼。服務器線程一直在工作。

我有一個步驟的問題 - 如何提供正確的球員秩序。 我想簡單的例子:

服務器 - 正在發送GUID(字符串): - 首先 - PLAYER1, - 二 - player2。 片段:

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沒有在日

回答

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的關鍵字。

如果您希望玩家順序採取行動,那麼當沒有其他玩家正在採取行動時,您必須將控制權從服務器傳遞到玩家,然後在玩家完成時從玩家返回到服務器。