📄 playerserverhandler.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 + -