📄 j_fir_server.java
字号:
}
//以上确认所邀请的用户是否还保持空闲状态
if (FindOne) {
if (NewGame) {
m_output[i].writeObject(PLAY_REQUEST+userName[Code]);
} else {
m_output[i].writeObject(CONTINUE_REQUEST+userName[Code]);
TransportationFinished[Code] = false;
TransportationFinished[i] = false;
//如果是"续下"模式就要进行文件传输
}
mb_displayAppend(userName[Code]+"向"+userName[i]+"发出了邀请。");
while (Response[i].equals(NO_RESPONSE))
;
//等待对方回音
str = Response[i];
if (str.equals(REQUEST_REJECTED)) {
m_output[Code].writeObject(REQUEST_REJECTED);
mb_displayAppend(userName[Code]+"的邀请被拒绝。");
TransportationFinished[Code] = true;
TransportationFinished[i] = true;
} else {
mBuf = new StringBuffer(str);
if (mBuf.indexOf(REQUEST_ACCEPTED)==0) {
mBuf.delete(0,REQUEST_ACCEPTED.length());
str = mBuf.toString();
if (str.equals(userName[Code])) {
m_output[Code].writeObject(REQUEST_ACCEPTED);
mb_displayAppend(userName[Code]+"成功邀请到"+userName[i]+"下棋!");
MatchedClient[Code] = i;
MatchedClient[i] = Code;
SideDecided[Code] = false;
SideDecided[i] = false;
SideQSent[Code] = false;
SideQSent[i] = false;
SideChosen[Code] = -1;
SideChosen[i] = -1;
//邀请成功后需要选棋等等
}
}
}
} else {
m_output[Code].writeObject(REQUEST_REJECTED);
mb_displayAppend(userName[Code]+"所邀请的用户已下线或正在下棋。");
}
} else
if (mBuf.indexOf(REQUEST_ACCEPTED)==0) {
Response[Code] = str;
MatchedClient[Code] = -2;
//接收了其他客户端的邀请,但对方姓名未在此发送,故用-2代替;用-2的其他原因自己有点忘记了。。。
mb_displayAppend("收到"+userName[Code]+"的接受邀请的回复。");
} else
if (str.equals(REQUEST_REJECTED)) {
Response[Code] = str;
mb_displayAppend("收到"+userName[Code]+"的拒绝邀请的回复。");
} else
if (str.equals(EXIT_SERVER)) {
//退出服务器
m_output[Code].writeObject(EXIT_SERVER);
Disconnected = true;
} else
if (str.equals(REPLAYING_GAME)) {
//正在复盘,请勿打扰
isReplaying[Code] = true;
} else
if (str.equals(EXIT_REPLAY)) {
//退出复盘,回归空闲状态
isReplaying[Code] = false;
}
}
if (Disconnected) break;
if (MatchedClient[Code]!=-1 && MatchedClient[Code]!=-2) {
u = Code;
v = MatchedClient[Code];
//为使下文简便,使用u,v分别代表两方
if (TransportationFinished[Code]) {
//正常模式或"续下"模式传输结束
if (u<v && !SideDecided[u]) {
SideQSent[u] = true;
SideQSent[v] = true;
m_output[u].writeObject(SIDE_DECISION);
mb_displayAppend("向"+userName[u]+"询问黑白棋选择。");
m_output[v].writeObject(SIDE_DECISION);
mb_displayAppend("向"+userName[v]+"询问黑白棋选择。");
}
while (!SideQSent[u])
;
//以上是强制u,v中有且仅有一个执行上面的语句块
}
str = (String) m_input[u].readObject();
mBuf = new StringBuffer(str);
if (mBuf.indexOf(SIDE_COLOR)==0) {
mBuf.delete(0,SIDE_COLOR.length());
str = mBuf.toString();
if (str.equals("BLACK")) {
SideDecided[u] = true;
SideChosen[u] = 1;
mb_displayAppend(userName[u]+"选择了黑棋。");
} else
if (str.equals("WHITE")) {
SideDecided[u] = true;
SideChosen[u] = 2;
mb_displayAppend(userName[u]+"选择了白棋。");
} else
if (str.equals("RANDOM")) {
SideDecided[u] = true;
SideChosen[u] = 3;
mb_displayAppend(userName[u]+"选择了随机。");
}
while (SideChosen[v]==-1)
;
//等待对方选棋
if (u<v) { //强制只执行一次
if (SideChosen[u]==1 && SideChosen[v]==2) {
} else
if (SideChosen[u]==2 && SideChosen[v]==1) {
i = v; v = u; u = i;
} else {
i = (int)(Math.random()*2)+1;
if (i==1) { i = v; v = u; u = i; }
}
m_output[u].writeObject(SIDE_COLOR+"BLACK");
mb_displayAppend(userName[u]+"执黑先下。");
m_output[v].writeObject(SIDE_COLOR+"WHITE");
mb_displayAppend(userName[v]+"执白后下。");
}
} else
if (mBuf.indexOf(PLAYING_COMMAND)==0) {
mb_displayAppend(userName[u]+"下棋了。");
m_output[v].writeObject(str);
} else
if (mBuf.indexOf(WINNER_DECIDED)==0) {
mBuf.delete(0,WINNER_DECIDED.length());
str = mBuf.toString();
if (str.equals("Win")) {
mb_displayAppend(userName[u]+"战胜了"+userName[v]+"!");
m_output[u].writeObject(WINNER_DECIDED+"Win");
m_output[v].writeObject(WINNER_DECIDED+userName[u]);
} else {
mb_displayAppend(userName[v]+"战胜了"+userName[u]+"!");
m_output[v].writeObject(WINNER_DECIDED+userName[v]);
m_output[v].writeObject(WINNER_DECIDED+"Win");
}
} else
if (str.equals(PLAY_AGAIN)) {
mb_displayAppend(userName[u]+"想和"+userName[v]+"再下一盘。");
m_output[v].writeObject(str);
} else
if (str.equals(I_WANT_TO_GO)) {
mb_displayAppend(userName[u]+"离开了对局室,回到了广场。");
if (MatchedClient[v]==u) m_output[v].writeObject(str);
MatchedClient[u] = -1;
} else
if (str.equals(EXIT_SERVER)) {
m_output[Code].writeObject(EXIT_SERVER);
Disconnected = true;
break;
} else
if (mBuf.indexOf(STEP_NUM)==0) {
//"续下"模式中 传输棋的步数
m_output[v].writeObject(str);
mBuf.delete(0,STEP_NUM.length());
str = mBuf.toString();
Continue_n = Integer.parseInt(str);
TransportationCount = -1;
if (Continue_n>-1) TransportationFinished[Code] = false;
} else
if (mBuf.indexOf(STEP_CONTENT)==0) {
//"续下"模式中 传输每步棋的位置
TransportationCount++;
if (TransportationCount==Continue_n) TransportationFinished[Code] = true;
mb_displayAppend("已传输了"+(TransportationCount+1)+"步");
m_output[v].writeObject(str);
} else
if (str.equals(DATA_RECEIVING_COMPLETED)) {
//"续下"模式 传输结束
TransportationFinished[u] = true;
} else
if (str.equals(I_REGRET)) {
//悔棋
m_output[v].writeObject(str);
} else
if (str.equals(REGRET_AS_YOU_LIKE)) {
//同意悔棋
m_output[v].writeObject(str);
} else
if (str.equals(NO_REGRET)) {
//拒绝悔棋,这几处server都充当"传话筒"
m_output[v].writeObject(str);
} else
{
//其余都归于聊天
mb_displayAppend(userName[u]+"对"+userName[v]+"说:"+str);
m_output[v].writeObject(str);
}
}
}
}
catch (Exception ee)
{
System.out.println("出现异常:"+ee);
ee.printStackTrace();
}
finally
{
try
{
mb_displayAppend("用户"+Code+"已断开与服务器的连接。");
if (MatchedClient[Code]>=0) m_output[MatchedClient[Code]].writeObject(DROP_LINE);
ClientOccupied[Code] = false;
m_clientNumber--;
}
catch (Exception ee)
{
System.out.println("出现异常:"+ee);
ee.printStackTrace();
}
}
}
}
public static void main(String args[])
{
J_FIR_Server app = new J_FIR_Server();
app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
app.setSize(400,400);
app.setVisible(true);
app.mb_run();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -