本人提交记录如下:
序号 | 完成功能和任务 | 描述 |
---|---|---|
1 | 悔棋功能 | 五子棋中的悔棋,回退上一步重走 |
2 | 联机对战服务端 | 局域网对战所需的服务端 |
3 | 联机对战客户端 | 连接到服务端,进行对战 |
4 | 联机对战 | 客户端之间进行通信,交替下棋 |
5 | 面向对象设计 | 使用面向对象技术进行程序设计 |
采用ServerSocket、Socket技术将服务端和客户端进行连接,客户端采用DataInputStream和DataOutputStream来输入和输出信息给服务端。
服务端使用多线程技术分别接收来自两个客户端传入的信息,再传入到另一个客户端。
客户端与服务端连接代码如下图:图1为服务端,图2为客户端
服务端通知客户端开始下棋代码如下图:图1为服务端,图2为客户端(图2中字有误,应为“从服务端中获取数据更新后让其开始下棋”)
最终效果如下:
利用之前客户端和服务端建立的socket,通过DataInputStream、DataOutputStream进行数据交互,根据传输的数据决定行动,两个客户端中都有一个线程实时监控来自服务端的信息。
用writeInt、readInt方法读取数据,数据采用int类型,因为五子棋中可行的操作比较少,另外还会需要更新对手在(x,y)位置下棋,因此int类型比较适合。
关于输赢:服务端与客户端一样拥有一个棋盘,每次客户端下棋后,服务端棋盘也会相应更新,所以当客户端1下出致胜一棋时,客户端1会将该下棋坐标告诉服务端,服务端在“云棋盘”上也下上这一步,并判定出玩家1获胜了,于是向客户端1传输胜利的信息,向客户端2传输玩家1刚刚下的棋的位置(使客户端2的棋盘更新),并传送失败的信息。
请求悔棋则见下代码截图:
效果如下:
部分代码:
class Exchange implements Runnable
{
// 判断数据的类型
private int x;
private Socket user1;
private Socket user2;
private boolean exit;
private DataInputStream fromUser1;
private DataOutputStream toUser2;
public Exchange(Socket user1, Socket user2)
{
this.user1 = user1;
this.user2 = user2;
try
{
fromUser1 = new DataInputStream(this.user1.getInputStream());
toUser2 = new DataOutputStream(this.user2.getOutputStream());
} catch (IOException e)
{
release();
}
}
@Override
public void run()
{
while (!exit)
{
try
{
x = fromUser1.readInt();
if (x == 1)
{
//下棋
row = fromUser1.readInt();
col = fromUser1.readInt();
waitFlag = false;
}
// 悔棋
else if (x == 3)
{
repentanceFlag = true;
toUser2.writeInt(3);
}
//悔棋确认
else if (x == 4)
{
Boolean bl = fromUser1.readBoolean();
//是否允许悔棋
toUser2.writeInt(4);
toUser2.writeBoolean(bl);
}
//重玩一局
else if(x == 5){
toUser2.writeInt(5);
}
else if(x == 6){
//重玩确认
Boolean bl = fromUser1.readBoolean();
toUser2.writeInt(6);
toUser2.writeBoolean(bl);
}
} catch (Exception e)
{
// 玩家异常退出或者逃跑
s.remove(user1);
waitFlag = false;
try
{
for (Socket socket : s)
{
if (socket == user2) {
toUser2.writeInt(9);
}
}
} catch (IOException e1)
{
e1.printStackTrace();
}
//释放资源
release();
}
}
}
private void release()
{
exit = true;
ConnectServer.close(user1, user2, fromUser1, toUser2);
}
}
UML图如下:
原文:https://www.cnblogs.com/silverash/p/14342852.html