📄 appserver.java
字号:
/*
* Created on 2005-2-13
*
*/
package tankgame.server;
import java.util.*;
import java.awt.Point;
import java.io.*;
import java.net.InetAddress;
import communication.*;
/**
* @author Emtry Immortal
*
* server
*/
public class AppServer implements IMsgListener {
Vector vClients = new Vector();
Receiver receiver;
Sender sender;
int serverRecivePort = 0;
int serverSendPort = 0;
Properties prpBattle = new Properties();
Point[] ptStart;
int iMaxIndex=0;
/**
*
*/
public AppServer() {
super();
Properties prpNet = new Properties();
try {
prpNet.load(new FileInputStream("configure" + File.separator
+ "Net.properties"));
serverRecivePort = Integer.parseInt(prpNet
.getProperty("ServerRecivePort"));
serverSendPort = Integer.parseInt(prpNet
.getProperty("ServerSendPort"));
receiver = new Receiver(serverRecivePort);
receiver.addListener(this);
receiver.start();
sender = new Sender(serverSendPort);
} catch (Exception e) {
e.printStackTrace();
}
//start points
try {
prpBattle.load(new FileInputStream("maps" + File.separator
+ "Battle.map"));
int npoint = Integer.parseInt(prpBattle.getProperty("NStartPoint"));
ptStart = new Point[npoint];
for (int i = 0; i < npoint; i++) {
String str = prpBattle.getProperty("StartPoint" + i);
int x = Integer.parseInt(str.substring(0, str.indexOf(',')));
int y = Integer.parseInt(str.substring(str.indexOf(',') + 1));
ptStart[i] = new Point(x, y);
}
} catch (Exception e) {
e.printStackTrace();
}
}
public void receiveMessage(Message msg, InetAddress address) {
switch (msg.getIType()) {
case Message.MSG_LOGIN:
m_login(msg, address);
break;
case Message.MSG_LOGOUT:
m_logout(msg, address);
break;
case Message.MSG_MOVE:
case Message.MSG_BARBETTE_TURN:
case Message.MSG_FIRE:
case Message.MSG_STOP:
m_motion(msg, address);
break;
}
printLog(msg.getIType(), msg.getIID(), address.toString());
}
private void m_motion(Message msg, InetAddress address) {
if (Message.MSG_MOVE == msg.getIType()) {
TnkClient tk = getTnkClient(msg.getIID());
if (tk == null) {
return;
}
tk.ptX = msg.getDPtX();
tk.ptY = msg.getDPtY();
}
for (int i = 0; i < vClients.size(); i++) {
TnkClient tk = (TnkClient) vClients.get(i);
if (tk.index == msg.getIID()) {
continue;
}
(sender).send(msg, tk.address, tk.receivePort);
}
}
private TnkClient getTnkClient(int index) {
for (int i = 0; i < vClients.size(); i++) {
TnkClient tk = (TnkClient) vClients.get(i);
if (index == tk.index) {
return tk;
}
}
return null;
}
private int getIndex() {
/*int max = 0;
for (int i = 0; i < vClients.size(); i++) {
TnkClient tk = (TnkClient) vClients.get(i);
if (max < tk.index) {
max = tk.index;
}
}
return max + 1;*/
return iMaxIndex++;
}
private void m_logout(Message msg, InetAddress address) {
vClients.remove(getTnkClient(msg.getIID()));
for (int i = 0; i < vClients.size(); i++) {
TnkClient tk = (TnkClient) vClients.get(i);
Message msgr = Message.getMsgRemoveTank(msg.getIID());
sender.send(msgr, tk.address, tk.receivePort);
}
}
private void m_login(Message msg, InetAddress address) {
int index;
Message msgc, msgcr, msgecho;
Point pt = getStartPoint();
index = getIndex();
TnkClient tnkClient = new TnkClient(msg.getStrName(), address, msg
.getRecivePort(), 0, pt.x, pt.y,index);
//create msg
msgc = Message.getMsgCreateTank(index, msg.getStrName(), 0, pt.x, pt.y);
//echo
msgecho = Message.getMsgLoginEcho(index, pt.x, pt.y);
printLog(String.valueOf(msg.getRecivePort()));
sender.send(msgecho, address, msg.getRecivePort());
for (int i = 0; i < vClients.size(); i++) {
TnkClient tk = (TnkClient) vClients.get(i);
if (tnkClient == tk) {
continue;
}
//send msg to other client to create a tank
sender.send(msgc, tk.address, tk.receivePort);
//send msg to new client to create existed tanks
msgcr = Message.getMsgCreateTank(tk.index, tk.strName,
tk.dDriect, tk.ptX, tk.ptY);
sender.send(msgcr, address, msg.getRecivePort());
}
vClients.addElement(tnkClient);
}
private Point getStartPoint() {
boolean isSetable = true;
for (int i = 0; i < ptStart.length; i++) {
isSetable = true;
for (int j = 0; j < vClients.size(); j++) {
TnkClient tk = (TnkClient) vClients.get(j);
if (ptStart[i].distance(tk.ptX, tk.ptY) < 50) {
isSetable = false;
break;
}
}
if (isSetable) {
return ptStart[i];
}
}
return ptStart[0];
}
public void close() {
this.receiver.interrupt();
}
public static void main(String[] args) {
printLog("server starting...");
AppServer app = new AppServer();
}
public static void printLog(int type, int index, String straddress) {
String str = "";
switch (type) {
case Message.MSG_MOVE:
str = "MSG_MOVE ";
break;
case Message.MSG_BARBETTE_TURN:
str = "MSG_BARBETTE_TURN ";
break;
case Message.MSG_FIRE:
str = "MSG_FIRE ";
break;
case Message.MSG_CREATE_TANK:
str = "MSG_CREATE_TANK ";
break;
case Message.MSG_REMOVE_TANK:
str = "MSG_REMOVE_TANK ";
break;
case Message.MSG_STOP:
str = "MSG_STOP ";
break;
case Message.MSG_LOGIN:
str = "MSG_LOGIN ";
break;
case Message.MSG_LOGOUT:
str = "MSG_LOGOUT ";
break;
case Message.MSG_LOGIN_ECHO:
str = "MSG_LOGIN_ECHO ";
break;
}
printLog(str + " intdex=" + index + " address=" + straddress);
}
public static void printLog(String str){
System.out.println(str);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -