⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 playerserverhandler.java

📁 java3D game engine design of the source [three-dimensionalvirtualrealitynetworkprogram] - "virtual
💻 JAVA
字号:

// PlayerServerHandler.java
// Andrew Davison, June 2003, dandrew@ratree.psu.ac.th

/* Handle messages from the client.

   Upon initial connection:
       response to client is:
             ok <playerID>   or    full
       message to other client if player is accepted:
             added <playerID>

   Other client messages:
   * disconnect
     message to other client:
             removed <playerID>
       
   * try <posn>
     response to client
        tooFewPlayers
      message to other client if turn accepted
        otherTurn <playerID> <posn>
*/

import java.net.*;
import java.io.*;
import java.util.*;


public class PlayerServerHandler extends Thread
{
  private FBFServer server;
  private Socket clientSock;
  private BufferedReader in;
  private PrintWriter out;

  private int playerID;     // this player id is assigned by FBFServer


  public PlayerServerHandler(Socket s, FBFServer serv)
  {
    clientSock = s;
    server = serv;
    System.out.println("Player connection request");
    try {
      in  = new BufferedReader( 
			    new InputStreamReader( clientSock.getInputStream() ) );
      out = new PrintWriter( clientSock.getOutputStream(), true );  // autoflush
    }
    catch(Exception e)
    {  System.out.println(e);  }
  }


  public void run()
  /* Add this player to FSFServer array, get an ID, then 
     start processing client-side input
  */
  {
    playerID = server.addPlayer(this);
    if (playerID != -1) {    // -1 means adding the player was rejected
      sendMessage("ok " + playerID);
      System.out.println("ok " + playerID);  // tell player his/her playerID
      server.tellOther(playerID, "added " + playerID);

      processPlayerInput();

      server.removePlayer(playerID);   // remove player from server data
      server.tellOther(playerID, "removed " + playerID);    // tell others
    }
    else    // game is full
      sendMessage("full");

    try {     // close socket from player
      clientSock.close();
      System.out.println("Player " + playerID + " connection closed\n");
    }
    catch(Exception e)
    {  System.out.println(e);  }

  }  // end of run()


   private void processPlayerInput()
   /* Stop when the input stream closes (is null) or "disconnect" is sent.
      Otherwise pass the input to doRequest(). */
   {
     String line;
     boolean done = false;
     try {
       while (!done) {
         if((line = in.readLine()) == null)
           done = true;
         else {
           // System.out.println("Player " + playerID + " msg: " + line);
           if (line.trim().equals("disconnect"))
             done = true;
           else 
             doRequest(line);
         }
       }
     }
     catch(IOException e)
     {  System.out.println("Player " + playerID + " closed the connection"); }
   }  // end of processPlayerInput()


  private void doRequest(String line)
  /*  The input line can be :
         try <posn>    -- try to occupy position pos (pos == 0-63)

      No checking of posn done here; we assume the client has checked it.
      No checking of turn order here; we assume the client is doing it
  */
  {
    if (line.startsWith("try")) {
      try {
        int posn = Integer.parseInt( line.substring(4).trim() );
        // System.out.println("Player " + playerID + " wants to occupy position " + posn);

        if (server.enoughPlayers())
          server.tellOther(playerID, "otherTurn " + playerID + " " + posn);  // pass turn to others
        else
          sendMessage("tooFewPlayers");
      }
      catch(NumberFormatException e)
      { System.out.println(e); } 
    }
  }  // end of doRequest()


  synchronized public void sendMessage(String msg)
  // called by handler and top-level server
  { try {
        out.println(msg);
    }
    catch(Exception e)
    {  System.out.println("Handler for player " + playerID + "\n" + e);  }
  }  // end of sendMessage()


}  // end of PlayerServerHandler class

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -