📄 gameserver.java
字号:
/**
游戏服务器类,负责控制游戏规则,为客户端提供
游戏控制信息
Download by http://www.codefans.net
**/
package game.multiplayer;
import java.net.*;
import java.util.*;
public class GameServer {
//player1的当前X坐标位置
static int player1 = 0;
//player2的当前X坐标位置
static int player2 = 140;
//player1的当前动作状态("go" 或者“hit”)
static String player1State = null;
//player2的当前动作状态("go" 或者“hit”)
static String player2State = null;
//player1的当前积分
static int player1Scope = 0;
//player2的当前积分
static int player2Scope = 0;
//存储玩家的向量对象
static Vector playerVector = new Vector();
//客户端UDP请求的处理者
class UDPRequestHandler
implements java.lang.Runnable {
String clientRequire;
DatagramSocket serverSocket;
InetAddress ipAddress;
int port;
public UDPRequestHandler(String clientRequire, DatagramSocket serverSocket,
InetAddress ipAddress, int port) {
this.clientRequire = clientRequire;
this.serverSocket = serverSocket;
this.ipAddress = ipAddress;
this.port = port;
}
//监听客户端UDP请求线程主方法
public void run() {
try {
UDPServerListener();
}
catch (Exception ex) {
ex.printStackTrace();
}
}
//监听客户端UDP请求
void UDPServerListener() throws Exception {
//应答客户端UDP请求状态串
String ackclientRequire = null;
//发送数据字节数组
byte[] sendData;
//解析客户端UDP请求命令串
int position = clientRequire.indexOf(":");
if (position != -1) {
String currentPlayer = clientRequire.substring(0, position);
String currentCmd = clientRequire.substring(position + 1,
clientRequire.length());
//处理player1的命令串
if (currentPlayer.equals("player1")) {
System.out.println("clientRequire= " + clientRequire);
//判断player1的当前状态
if (currentCmd.equals("go")) {
if ( (player1 + 30) < player2) {
player1 = player1 + 2;
}
//设置player1的当前状态为“go”
player1State = "go";
}
else if (currentCmd.equals("hit")) {
//设置player1的当前状态为“hit”
player1State = "hit";
}
else if (currentCmd.equals("pause")) {
//设置player1的当前状态为“go”
player1State = "go";
}
else if (currentCmd.equals("reset")) {
//重置所有player状态
reset();
} //处理player1后退命令
else if (currentCmd.equals("back")) {
if (player1 > 2) {
player1 = player1 - 2;
}
//设置player1的当前状态为“go”
player1State = "go";
} //处理player1积分命令
else if (currentCmd.equals("scope")) {
if (player1Scope < 100) {
player1Scope = player1Scope + 5;
}
else {
player1Scope = 0;
}
player1State = "go";
}
} //处理player2的命令串
else if (currentPlayer.equals("player2")) {
if (currentCmd.equals("go")) {
if ( (player1 + 30) < player2) {
player2 = player2 - 2;
}
//设置player2的当前状态为“go”
player2State = "go";
}
else if (currentCmd.equals("hit")) {
//设置player2的当前状态为“hit”
player2State = "hit";
}
else if (currentCmd.equals("pause")) {
//设置player2的当前状态为“go”
player2State = "go";
}
else if (currentCmd.equals("reset")) {
//重置所有player状态
reset();
} //处理player2后退命令
else if (currentCmd.equals("back")) {
System.out.println("player2= " + player2);
if (player2 < 140) {
player2 = player2 + 2;
}
player2State = "go";
} //处理player2积分命令
else if (currentCmd.equals("scope")) {
if (player2Scope < 100) {
player2Scope = player2Scope + 5;
}
else {
player2Scope = 0;
}
player2State = "go";
}
}
//处理player注销请求
if (currentCmd.equals("logout")) {
logout(currentPlayer);
}
//组合应答状态串
ackclientRequire = player1 + "," + player2 + ":" + player1State + "," +
player2State + "?" + player1Scope + "," + player2Scope;
} //处理来自客户端的加入请求
else if (clientRequire.equals("attend")) {
if (playerVector.size() < 2) {
if (playerVector.size() > 0) {
String playerName = (String) playerVector.firstElement();
if (playerName != null) {
if (playerName.equals("player1")) {
ackclientRequire = "player2";
}
else {
ackclientRequire = "player1";
}
}
}
else {
ackclientRequire = "player1";
}
playerVector.addElement(ackclientRequire);
}
else { //控制玩家人数最多为2个
playerVector.removeAllElements();
ackclientRequire = "player1";
playerVector.addElement(ackclientRequire);
}
if (ackclientRequire.equals("player1")) {
player1State = "go";
}
else {
player2State = "go";
}
}
else if (clientRequire.equals("query")) {
//组合应答状态串
ackclientRequire = player1 + "," + player2 + ":" + player1State + "," +
player2State + "?" + player1Scope + "," + player2Scope;
}
//发送应答状态串
sendData = ackclientRequire.getBytes();
DatagramPacket sendPacket = new DatagramPacket(
sendData, sendData.length, ipAddress, port);
serverSocket.send(sendPacket);
}
}
//重置服务器状态
private void reset() {
player1State = "go";
player2State = "go";
player1 = 0;
player2 = 140;
player1Scope = 0;
player2Scope = 0;
}
//处理客户端注销请求
private void logout(String currentPlayer) {
if (currentPlayer.equals("player1")) {
playerVector.remove("player1");
player1State = "null";
player1 = 0;
player1Scope = 0;
}
else if (currentPlayer.equals("player2")) {
playerVector.remove("player2");
player2State = "null";
player2 = 140;
player2Scope = 0;
}
}
//游戏服务器主方法
public static void main(String args[]) throws Exception {
GameServer gameServer = new GameServer();
/* 打开一个数据报文套接口 5188 */
DatagramSocket serverSocket = new DatagramSocket(5188);
//监听客户端UDP请求命令串
String clientRequire = null;
//申请缓冲内存用来收发数据
byte[] receiveData = new byte[1024];
//绑定一个packet 对象用来接收数据
DatagramPacket packet = new DatagramPacket(receiveData,
receiveData.length);
//循环监听来自客户端的UDP请求
while (true) {
// 监听客户端的请求,没有请求则在这里等待
serverSocket.receive(packet);
//获取数据包的来源地址与端口号
InetAddress ipAddress = packet.getAddress();
int port = packet.getPort();
//接收来自客户端UDP请求数据包
clientRequire = new String(packet.getData(), 0, packet.getLength());
gameServer.start(clientRequire, serverSocket, ipAddress, port);
}
}
//启动服务器
void start(String clientRequire, DatagramSocket serverSocket,
InetAddress ipAddress, int port) {
{
new java.lang.Thread(new UDPRequestHandler(clientRequire, serverSocket,
ipAddress, port)).start();
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -