本文实例为大家分享了Java实现五子棋网络版的具体代码,供大家参考,具体内容如下
需求分析:
对于网络五子棋而言,在普通五子棋的基础上需要添加以下功能:
1.拥有服务器端和客户端,用户通过客户端登录服务器后可与其他登录的用户进行对弈
2.服务器支持多组用户同时进行对弈
3.用户可以在服务器上创建新游戏或加入已创建的游戏
4.用户在下棋的时候可以进行聊天交流
由上可以知道需要实现的功能:
·提供服务器和客户端的功能
·服务器将监听客户端的登录情况并允许多个客户端进行登录
·用户通过客户端可以登录服务器,之后可以看到服务器当前在线的其他用户,并与他们进行聊天等
·用户登录服务器后,可以创建新的五子棋游戏或加入已创建的五子棋游戏
·用户通过客户端可以像普通五子棋那样与其他用户对弈
根据功能将网络五子棋分为4个模块:即用户面板模块、棋盘面板模块、五子棋服务器模块、五子棋客户端模块
下面我们开始进行编译用户面板模块:
1.开发用户列表面板
import java.awt.*; /** * Created by Administrator on 2016/11/21. */ //初始状态下将添加10个名称为“无用户“的信息到列表中,说明服务器最多支持10个用户同时在线 //该列表被添加到面板中,使用“BorderLayout”布局格式 public class UserListPad extends Panel{ public List userList=new List(10); public UserListPad(){ setLayout(new BorderLayout()); for(int i=0;i<10;i++){ userList.add(i+"."+"无用户"); } add(userList,BorderLayout.CENTER); } }
2.开发用户聊天面板
import javax.swing.*; import java.awt.*; /** * Created by Administrator on 2016/11/21. */ //聊天面板为一个TextArea视图控件,拥有一个垂直方向的滚动条。 //该TextArea被添加到面板中,使用“BorderLayout”布局格式。 public class UserChatPad extends JPanel{ public JTextArea chatTextArea=new JTextArea("命令区域",18,20); public UserChatPad(){ setLayout(new BorderLayout()); chatTextArea.setAutoscrolls(true); chatTextArea.setLineWrap(true); add(chatTextArea,BorderLayout.CENTER); } }
3.开发用户输入面板
import javax.swing.*; import java.awt.*; /** * Created by Administrator on 2016/11/21. */ //面板包含两个视图控件 //contentInpitted为TextField控件,用户可以在其中输入聊天信息 public class UserInputPad extends JPanel{ public JTextField cOntentInputted= new JTextField("",26); public JComboBox userChoice = new JComboBox(); public UserInputPad(){ setLayout(new FlowLayout(FlowLayout.LEFT)); for(int i=0;i<50;i++){ userChoice.addItem(i+"."+"无用户"); } userChoice.setSize(60,24); add(userChoice); add(contentInputted); } }
4.开发用户操作面板
import javax.swing.*; import java.awt.*; /** * Created by Administrator on 2016/11/21. */ public class UserControlPad extends JPanel { public JLabel ipLabel = new JLabel("IP",JLabel.LEFT); public JTextField ipInputted = new JTextField("localhost",10); public JButton cOnnectButton= new JButton("连接到服务器"); public JButton createButton = new JButton("创建游戏"); public JButton joinButton = new JButton("加入游戏"); public JButton cancelButton = new JButton("放弃游戏"); public JButton exitButton = new JButton("退出游戏"); public UserControlPad(){ setLayout(new FlowLayout(FlowLayout.LEFT)); setBackground(Color.LIGHT_GRAY); add(ipLabel); add(ipInputted); add(connectButton); add(createButton); add(joinButton); add(cancelButton); add(exitButton); } }
下面开始开发棋盘面板模块
1.开发黑棋类
import java.awt.*; /** * Created by Administrator on 2016/11/21. */ public class FIRPointBlack extends Canvas { FIRPad padBelonged; // 黑棋所属的棋盘 public FIRPointBlack(FIRPad padBelonged) { setSize(20, 20); // 设置棋子大小 this.padBelOnged= padBelonged; } public void paint(Graphics g) { // 画棋子 g.setColor(Color.black); g.fillOval(0, 0, 14, 14); } }
2.开发白棋类
import java.awt.*; /** * Created by Administrator on 2016/11/21. */ public class FIRPointWhite extends Canvas{ FIRPad padBelonged; // 白棋所属的棋盘 public FIRPointWhite(FIRPad padBelonged) { setSize(20, 20); this.padBelOnged= padBelonged; } public void paint(Graphics g) { // 画棋子 g.setColor(Color.white); g.fillOval(0, 0, 14, 14); } }
3.开发棋盘面板
import java.awt.*; import java.awt.event.*; import java.io.*; import java.net.*; import javax.swing.JTextField; /** * Created by Administrator on 2016/11/21. */ public class FIRPad extends Panel implements MouseListener,ActionListener{ // 鼠标是否能使用 public boolean isMouseEnabled = false; // 是否胜利 public boolean isWinned = false; // 是否在下棋中 public boolean isGaming = false; // 棋子的x轴坐标位 public int chessX_POS = -1; // 棋子的y轴坐标位 public int chessY_POS = -1; // 棋子的颜色 public int chessColor = 1; // 黑棋x轴坐标位数组 public int chessBlack_XPOS[] = new int[200]; // 黑棋y轴坐标位数组 public int chessBlack_YPOS[] = new int[200]; // 白棋x轴坐标位数组 public int chessWhite_XPOS[] = new int[200]; // 白棋y轴坐标位数组 public int chessWhite_YPOS[] = new int[200]; // 黑棋数量 public int chessBlackCount = 0; // 白棋数量 public int chessWhiteCount = 0; // 黑棋获胜次数 public int chessBlackVicTimes = 0; // 白棋获胜次数 public int chessWhiteVicTimes = 0; // 套接口 public Socket chessSocket; public DataInputStream inputData; public DataOutputStream outputData; public String chessSelfName = null; public String chessPeerName = null; public String host = null; public int port = 4331; public TextField statusText = new TextField("请连接服务器!"); public FIRThread firThread = new FIRThread(this); public FIRPad() { setSize(440, 440); setLayout(null); setBackground(Color.LIGHT_GRAY); addMouseListener(this); add(statusText); statusText.setBounds(new Rectangle(40, 5, 360, 24)); statusText.setEditable(false); } // 连接到主机 public boolean connectServer(String ServerIP, int ServerPort) throws Exception { try { // 取得主机端口 chessSocket = new Socket(ServerIP, ServerPort); // 取得输入流 inputData = new DataInputStream(chessSocket.getInputStream()); // 取得输出流 outputData = new DataOutputStream(chessSocket.getOutputStream()); firThread.start(); return true; } catch (IOException ex) { statusText.setText("连接失败! \n"); } return false; } // 设定胜利时的棋盘状态 public void setVicStatus(int vicChessColor) { // 清空棋盘 this.removeAll(); // 将黑棋的位置设置到零点 for (int i = 0; i <= chessBlackCount; i++) { chessBlack_XPOS[i] = 0; chessBlack_YPOS[i] = 0; } // 将白棋的位置设置到零点 for (int i = 0; i <= chessWhiteCount; i++) { chessWhite_XPOS[i] = 0; chessWhite_YPOS[i] = 0; } // 清空棋盘上的黑棋数 chessBlackCount = 0; // 清空棋盘上的白棋数 chessWhiteCount = 0; add(statusText); statusText.setBounds(40, 5, 360, 24); if (vicChessColor == 1) { // 黑棋胜 chessBlackVicTimes++; statusText.setText("黑方胜,黑:白 " + chessBlackVicTimes + ":" + chessWhiteVicTimes + ",游戏重启,等待白方..."); } else if (vicChessColor == -1) { // 白棋胜 chessWhiteVicTimes++; statusText.setText("白方胜,黑:白 " + chessBlackVicTimes + ":" + chessWhiteVicTimes + ",游戏重启,等待黑方..."); } } // 取得指定棋子的位置 public void setLocation(int xPos, int yPos, int chessColor) { if (chessColor == 1) { // 棋子为黑棋时 chessBlack_XPOS[chessBlackCount] = xPos * 20; chessBlack_YPOS[chessBlackCount] = yPos * 20; chessBlackCount++; } else if (chessColor == -1) { // 棋子为白棋时 chessWhite_XPOS[chessWhiteCount] = xPos * 20; chessWhite_YPOS[chessWhiteCount] = yPos * 20; chessWhiteCount++; } } // 判断当前状态是否为胜利状态 public boolean checkVicStatus(int xPos, int yPos, int chessColor) { int chessLinkedCount = 1; // 连接棋子数 int chessLinkedCompare = 1; // 用于比较是否要继续遍历一个棋子的相邻网格 int chessToCompareIndex = 0; // 要比较的棋子在数组中的索引位置 int closeGrid = 1; // 相邻网格的位置 if (chessColor == 1) { // 黑棋时 chessLinkedCount = 1; // 将该棋子自身算入的话,初始连接数为1 //以下每对for循环语句为一组,因为下期的位置能位于中间而非两端 for (closeGrid = 1; closeGrid <= 4; closeGrid++) { // 遍历相邻4个网格 for (chessToCompareIndex = 0; chessToCompareIndex <= chessBlackCount; chessToCompareIndex++) { // 遍历棋盘上所有黑棋子 if (((xPos + closeGrid) * 20 == chessBlack_XPOS[chessToCompareIndex]) && ((yPos * 20) == chessBlack_YPOS[chessToCompareIndex])) { // 判断当前下的棋子的右边4个棋子是否都为黑棋 chessLinkedCount = chessLinkedCount + 1; // 连接数加1 if (chessLinkedCount == 5) { // 五子相连时,胜利 return true; } } } if (chessLinkedCount == (chessLinkedCompare + 1)) { chessLinkedCompare++; } else {// 若中间有一个棋子非黑棋,则会进入此分支,此时无需再遍历 break; } } for (closeGrid = 1; closeGrid <= 4; closeGrid++) { for (chessToCompareIndex = 0; chessToCompareIndex <= chessBlackCount; chessToCompareIndex++) { if (((xPos - closeGrid) * 20 == chessBlack_XPOS[chessToCompareIndex]) && (yPos * 20 == chessBlack_YPOS[chessToCompareIndex])) { // 判断当前下的棋子的左边4个棋子是否都为黑棋 chessLinkedCount++; if (chessLinkedCount == 5) { return true; } } } if (chessLinkedCount == (chessLinkedCompare + 1)) { chessLinkedCompare++; } else { break; } } // 进入新的一组for循环时要将连接数等重置 chessLinkedCount = 1; chessLinkedCompare = 1; for (closeGrid = 1; closeGrid <= 4; closeGrid++) { for (chessToCompareIndex = 0; chessToCompareIndex <= chessBlackCount; chessToCompareIndex++) { if ((xPos * 20 == chessBlack_XPOS[chessToCompareIndex]) && ((yPos + closeGrid) * 20 == chessBlack_YPOS[chessToCompareIndex])) { // 判断当前下的棋子的上边4个棋子是否都为黑棋 chessLinkedCount++; if (chessLinkedCount == 5) { return true; } } } if (chessLinkedCount == (chessLinkedCompare + 1)) { chessLinkedCompare++; } else { break; } } for (closeGrid = 1; closeGrid <= 4; closeGrid++) { for (chessToCompareIndex = 0; chessToCompareIndex <= chessBlackCount; chessToCompareIndex++) { if ((xPos * 20 == chessBlack_XPOS[chessToCompareIndex]) && ((yPos - closeGrid) * 20 == chessBlack_YPOS[chessToCompareIndex])) { // 判断当前下的棋子的下边4个棋子是否都为黑棋 chessLinkedCount++; if (chessLinkedCount == 5) { return true; } } } if (chessLinkedCount == (chessLinkedCompare + 1)) { chessLinkedCompare++; } else { break; } } chessLinkedCount = 1; chessLinkedCompare = 1; for (closeGrid = 1; closeGrid <= 4; closeGrid++) { for (chessToCompareIndex = 0; chessToCompareIndex <= chessBlackCount; chessToCompareIndex++) { if (((xPos - closeGrid) * 20 == chessBlack_XPOS[chessToCompareIndex]) && ((yPos + closeGrid) * 20 == chessBlack_YPOS[chessToCompareIndex])) { // 判断当前下的棋子的左上方向4个棋子是否都为黑棋 chessLinkedCount++; if (chessLinkedCount == 5) { return true; } } } if (chessLinkedCount == (chessLinkedCompare + 1)) { chessLinkedCompare++; } else { break; } } for (closeGrid = 1; closeGrid <= 4; closeGrid++) { for (chessToCompareIndex = 0; chessToCompareIndex <= chessBlackCount; chessToCompareIndex++) { if (((xPos + closeGrid) * 20 == chessBlack_XPOS[chessToCompareIndex]) && ((yPos - closeGrid) * 20 == chessBlack_YPOS[chessToCompareIndex])) { // 判断当前下的棋子的右下方向4个棋子是否都为黑棋 chessLinkedCount++; if (chessLinkedCount == 5) { return true; } } } if (chessLinkedCount == (chessLinkedCompare + 1)) { chessLinkedCompare++; } else { break; } } chessLinkedCount = 1; chessLinkedCompare = 1; for (closeGrid = 1; closeGrid <= 4; closeGrid++) { for (chessToCompareIndex = 0; chessToCompareIndex <= chessBlackCount; chessToCompareIndex++) { if (((xPos + closeGrid) * 20 == chessBlack_XPOS[chessToCompareIndex]) && ((yPos + closeGrid) * 20 == chessBlack_YPOS[chessToCompareIndex])) { // 判断当前下的棋子的右上方向4个棋子是否都为黑棋 chessLinkedCount++; if (chessLinkedCount == 5) { return true; } } } if (chessLinkedCount == (chessLinkedCompare + 1)) { chessLinkedCompare++; } else { break; } } for (closeGrid = 1; closeGrid <= 4; closeGrid++) { for (chessToCompareIndex = 0; chessToCompareIndex <= chessBlackCount; chessToCompareIndex++) { if (((xPos - closeGrid) * 20 == chessBlack_XPOS[chessToCompareIndex]) && ((yPos - closeGrid) * 20 == chessBlack_YPOS[chessToCompareIndex])) { // 判断当前下的棋子的左下方向4个棋子是否都为黑棋 chessLinkedCount++; if (chessLinkedCount == 5) { return true; } } } if (chessLinkedCount == (chessLinkedCompare + 1)) { chessLinkedCompare++; } else { break; } } } else if (chessColor == -1) { // 白棋时 chessLinkedCount = 1; for (closeGrid = 1; closeGrid <= 4; closeGrid++) { for (chessToCompareIndex = 0; chessToCompareIndex <= chessWhiteCount; chessToCompareIndex++) { if (((xPos + closeGrid) * 20 == chessWhite_XPOS[chessToCompareIndex]) && (yPos * 20 == chessWhite_YPOS[chessToCompareIndex])) {// 判断当前下的棋子的右边4个棋子是否都为白棋 chessLinkedCount++; if (chessLinkedCount == 5) { return true; } } } if (chessLinkedCount == (chessLinkedCompare + 1)) { chessLinkedCompare++; } else { break; } } for (closeGrid = 1; closeGrid <= 4; closeGrid++) { for (chessToCompareIndex = 0; chessToCompareIndex <= chessWhiteCount; chessToCompareIndex++) { if (((xPos - closeGrid) * 20 == chessWhite_XPOS[chessToCompareIndex]) && (yPos * 20 == chessWhite_YPOS[chessToCompareIndex])) {// 判断当前下的棋子的左边4个棋子是否都为白棋 chessLinkedCount++; if (chessLinkedCount == 5) { return true; } } } if (chessLinkedCount == (chessLinkedCompare + 1)) { chessLinkedCompare++; } else { break; } } chessLinkedCount = 1; chessLinkedCompare = 1; for (closeGrid = 1; closeGrid <= 4; closeGrid++) { for (chessToCompareIndex = 0; chessToCompareIndex <= chessWhiteCount; chessToCompareIndex++) { if ((xPos * 20 == chessWhite_XPOS[chessToCompareIndex]) && ((yPos + closeGrid) * 20 == chessWhite_YPOS[chessToCompareIndex])) {// 判断当前下的棋子的上边4个棋子是否都为白棋 chessLinkedCount++; if (chessLinkedCount == 5) { return true; } } } if (chessLinkedCount == (chessLinkedCompare + 1)) { chessLinkedCompare++; } else { break; } } for (closeGrid = 1; closeGrid <= 4; closeGrid++) { for (chessToCompareIndex = 0; chessToCompareIndex <= chessWhiteCount; chessToCompareIndex++) { if ((xPos * 20 == chessWhite_XPOS[chessToCompareIndex]) && ((yPos - closeGrid) * 20 == chessWhite_YPOS[chessToCompareIndex])) {// 判断当前下的棋子的下边4个棋子是否都为白棋 chessLinkedCount++; if (chessLinkedCount == 5) { return true; } } } if (chessLinkedCount == (chessLinkedCompare + 1)) { chessLinkedCompare++; } else { break; } } chessLinkedCount = 1; chessLinkedCompare = 1; for (closeGrid = 1; closeGrid <= 4; closeGrid++) { for (chessToCompareIndex = 0; chessToCompareIndex <= chessWhiteCount; chessToCompareIndex++) { if (((xPos - closeGrid) * 20 == chessWhite_XPOS[chessToCompareIndex]) && ((yPos + closeGrid) * 20 == chessWhite_YPOS[chessToCompareIndex])) {// 判断当前下的棋子的左上方向4个棋子是否都为白棋 chessLinkedCount++; if (chessLinkedCount == 5) { return true; } } } if (chessLinkedCount == (chessLinkedCompare + 1)) { chessLinkedCompare++; } else { break; } } for (closeGrid = 1; closeGrid <= 4; closeGrid++) { for (chessToCompareIndex = 0; chessToCompareIndex <= chessWhiteCount; chessToCompareIndex++) { if (((xPos + closeGrid) * 20 == chessWhite_XPOS[chessToCompareIndex]) && ((yPos - closeGrid) * 20 == chessWhite_YPOS[chessToCompareIndex])) {// 判断当前下的棋子的右下方向4个棋子是否都为白棋 chessLinkedCount++; if (chessLinkedCount == 5) { return true; } } } if (chessLinkedCount == (chessLinkedCompare + 1)) { chessLinkedCompare++; } else { break; } } chessLinkedCount = 1; chessLinkedCompare = 1; for (closeGrid = 1; closeGrid <= 4; closeGrid++) { for (chessToCompareIndex = 0; chessToCompareIndex <= chessWhiteCount; chessToCompareIndex++) { if (((xPos + closeGrid) * 20 == chessWhite_XPOS[chessToCompareIndex]) && ((yPos + closeGrid) * 20 == chessWhite_YPOS[chessToCompareIndex])) {// 判断当前下的棋子的右上方向4个棋子是否都为白棋 chessLinkedCount++; if (chessLinkedCount == 5) { return true; } } } if (chessLinkedCount == (chessLinkedCompare + 1)) { chessLinkedCompare++; } else { break; } } for (closeGrid = 1; closeGrid <= 4; closeGrid++) { for (chessToCompareIndex = 0; chessToCompareIndex <= chessWhiteCount; chessToCompareIndex++) { if (((xPos - closeGrid) * 20 == chessWhite_XPOS[chessToCompareIndex]) && ((yPos - closeGrid) * 20 == chessWhite_YPOS[chessToCompareIndex])) {// 判断当前下的棋子的左下方向4个棋子是否都为白棋 chessLinkedCount++; if (chessLinkedCount == 5) { return (true); } } } if (chessLinkedCount == (chessLinkedCompare + 1)) { chessLinkedCompare++; } else { break; } } } return false; } // 画棋盘 public void paint(Graphics g) { for (int i = 40; i <= 380; i = i + 20) { g.drawLine(40, i, 400, i); } g.drawLine(40, 400, 400, 400); for (int j = 40; j <= 380; j = j + 20) { g.drawLine(j, 40, j, 400); } g.drawLine(400, 40, 400, 400); g.fillOval(97, 97, 6, 6); g.fillOval(337, 97, 6, 6); g.fillOval(97, 337, 6, 6); g.fillOval(337, 337, 6, 6); g.fillOval(217, 217, 6, 6); } // 画棋子 public void paintFirPoint(int xPos, int yPos, int chessColor) { FIRPointBlack firPBlack = new FIRPointBlack(this); FIRPointWhite firPWhite = new FIRPointWhite(this); if (chessColor == 1 && isMouseEnabled) { // 黑棋 // 设置棋子的位置 setLocation(xPos, yPos, chessColor); // 取得当前局面状态 isWinned = checkVicStatus(xPos, yPos, chessColor); if (isWinned == false) { // 非胜利状态 firThread.sendMessage("/" + chessPeerName + " /chess " + xPos + " " + yPos + " " + chessColor); this.add(firPBlack); // 将棋子添加到棋盘中 firPBlack.setBounds(xPos * 20 - 7, yPos * 20 - 7, 16, 16); // 设置棋子边界 statusText.setText("黑(第" + chessBlackCount + "步)" + xPos + " " + yPos + ",轮到白方."); isMouseEnabled = false; // 将鼠标设为不可用 } else { // 胜利状态 firThread.sendMessage("/" + chessPeerName + " /chess " + xPos + " " + yPos + " " + chessColor); this.add(firPBlack); firPBlack.setBounds(xPos * 20 - 7, yPos * 20 - 7, 16, 16); setVicStatus(1); // 调用胜利方法,传入参数为黑棋胜利 isMouseEnabled = false; } } else if (chessColor == -1 && isMouseEnabled) { // 白棋 setLocation(xPos, yPos, chessColor); isWinned = checkVicStatus(xPos, yPos, chessColor); if (isWinned == false) { firThread.sendMessage("/" + chessPeerName + " /chess " + xPos + " " + yPos + " " + chessColor); this.add(firPWhite); firPWhite.setBounds(xPos * 20 - 7, yPos * 20 - 7, 16, 16); statusText.setText("白(第" + chessWhiteCount + "步)" + xPos + " " + yPos + ",轮到黑方."); isMouseEnabled = false; } else { firThread.sendMessage("/" + chessPeerName + " /chess " + xPos + " " + yPos + " " + chessColor); this.add(firPWhite); firPWhite.setBounds(xPos * 20 - 7, yPos * 20 - 7, 16, 16); setVicStatus(-1); // 调用胜利方法,传入参数为白棋 isMouseEnabled = false; } } } // 画网络棋盘 public void paintNetFirPoint(int xPos, int yPos, int chessColor) { FIRPointBlack firPBlack = new FIRPointBlack(this); FIRPointWhite firPWhite = new FIRPointWhite(this); setLocation(xPos, yPos, chessColor); if (chessColor == 1) { isWinned = checkVicStatus(xPos, yPos, chessColor); if (isWinned == false) { this.add(firPBlack); firPBlack.setBounds(xPos * 20 - 7, yPos * 20 - 7, 16, 16); statusText.setText("黑(第" + chessBlackCount + "步)" + xPos + " " + yPos + ",轮到白方."); isMouseEnabled = true; } else { firThread.sendMessage("/" + chessPeerName + " /victory " + chessColor);//djr this.add(firPBlack); firPBlack.setBounds(xPos * 20 - 7, yPos * 20 - 7, 16, 16); setVicStatus(1); isMouseEnabled = true; } } else if (chessColor == -1) { isWinned = checkVicStatus(xPos, yPos, chessColor); if (isWinned == false) { this.add(firPWhite); firPWhite.setBounds(xPos * 20 - 7, yPos * 20 - 7, 16, 16); statusText.setText("白(第" + chessWhiteCount + "步)" + xPos + " " + yPos + ",轮到黑方."); isMouseEnabled = true; } else { firThread.sendMessage("/" + chessPeerName + " /victory " + chessColor); this.add(firPWhite); firPWhite.setBounds(xPos * 20 - 7, yPos * 20 - 7, 16, 16); setVicStatus(-1); isMouseEnabled = true; } } } // 捕获下棋事件 public void mousePressed(MouseEvent e) { if (e.getModifiers() == InputEvent.BUTTON1_MASK) { chessX_POS = (int) e.getX(); chessY_POS = (int) e.getY(); int a = (chessX_POS + 10) / 20, b = (chessY_POS + 10) / 20; if (chessX_POS / 20 <2 || chessY_POS / 20 <2 || chessX_POS / 20 > 19 || chessY_POS / 20 > 19) { // 下棋位置不正确时,不执行任何操作 } else { paintFirPoint(a, b, chessColor); // 画棋子 } } } public void mouseReleased(MouseEvent e){} public void mouseEntered(MouseEvent e){} public void mouseExited(MouseEvent e){} public void mouseClicked(MouseEvent e){} public void actionPerformed(ActionEvent e){} }
4.开发棋盘线程
import java.util.StringTokenizer; import java.io.IOException; /** * Created by Administrator on 2016/11/21. */ public class FIRThread extends Thread{ FIRPad currPad; // 当前线程的棋盘 public FIRThread(FIRPad currPad) { this.currPad = currPad; } // 处理取得的信息 public void dealWithMsg(String msgReceived) { if (msgReceived.startsWith("/chess ")) { // 收到的信息为下棋 StringTokenizer userMsgToken = new StringTokenizer(msgReceived, " "); // 表示棋子信息的数组、0索引为:x坐标;1索引位:y坐标;2索引位:棋子颜色 String[] chessInfo = { "-1", "-1", "0" }; int i = 0; // 标志位 String chessInfoToken; while (userMsgToken.hasMoreTokens()) { chessInfoToken = (String) userMsgToken.nextToken(" "); if (i >= 1 && i <= 3) { chessInfo[i - 1] = chessInfoToken; } i++; } currPad.paintNetFirPoint(Integer.parseInt(chessInfo[0]), Integer .parseInt(chessInfo[1]), Integer.parseInt(chessInfo[2])); } else if (msgReceived.startsWith("/yourname ")) { // 收到的信息为改名 currPad.chessSelfName = msgReceived.substring(10); } else if (msgReceived.equals("/error")) { // 收到的为错误信息 currPad.statusText.setText("用户不存在,请重新加入!"); } } // 发送信息 public void sendMessage(String sndMessage) { try { currPad.outputData.writeUTF(sndMessage); } catch (Exception ea) { ea.printStackTrace();; } } public void run() { String msgReceived = ""; try { while (true) { // 等待信息输入 msgReceived = currPad.inputData.readUTF(); dealWithMsg(msgReceived); } } catch (IOException es){} } }
下面开始开发服务器模块
1.开发服务器信息面板
import java.awt.BorderLayout; import java.awt.Color; import java.awt.FlowLayout; import java.awt.Label; import java.awt.Panel; import java.awt.TextArea; import javax.swing.JLabel; /** * Created by Administrator on 2016/11/21. */ public class ServerMsgPanel extends Panel { public TextArea msgTextArea = new TextArea("", 22, 50, TextArea.SCROLLBARS_VERTICAL_ONLY); public JLabel statusLabel = new JLabel("当前连接数:", Label.LEFT); public Panel msgPanel = new Panel(); public Panel statusPanel = new Panel(); public ServerMsgPanel() { setSize(350, 300); setBackground(Color.LIGHT_GRAY); setLayout(new BorderLayout()); msgPanel.setLayout(new FlowLayout()); msgPanel.setSize(210, 210); statusPanel.setLayout(new BorderLayout()); statusPanel.setSize(210, 50); msgPanel.add(msgTextArea); statusPanel.add(statusLabel, BorderLayout.WEST); add(msgPanel, BorderLayout.CENTER); add(statusPanel, BorderLayout.NORTH); } }
2.开发服务器进程
import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.Socket; import java.util.Enumeration; import java.util.Hashtable; import java.util.StringTokenizer; /** * Created by Administrator on 2016/11/21. */ public class FIRServerThread extends Thread{ Socket clientSocket; // 保存客户端套接口信息 Hashtable clientDataHash; // 保存客户端端口与输出流对应的Hash Hashtable clientNameHash; // 保存客户端套接口和客户名对应的Hash Hashtable chessPeerHash; // 保存游戏创建者和游戏加入者对应的Hash ServerMsgPanel serverMsgPanel; boolean isClientClosed = false; public FIRServerThread(Socket clientSocket, Hashtable clientDataHash, Hashtable clientNameHash, Hashtable chessPeerHash, ServerMsgPanel server) { this.clientSocket = clientSocket; this.clientDataHash = clientDataHash; this.clientNameHash = clientNameHash; this.chessPeerHash = chessPeerHash; this.serverMsgPanel = server; } public void dealWithMsg(String msgReceived) { String clientName; String peerName; if (msgReceived.startsWith("/")) { if (msgReceived.equals("/list")) { // 收到的信息为更新用户列表 Feedback(getUserList()); } else if (msgReceived.startsWith("/creatgame [inchess]")) { // 收到的信息为创建游戏 String gameCreaterName = msgReceived.substring(20); //取得服务器名 synchronized (clientNameHash) { // 将用户端口放到用户列表中 clientNameHash.put(clientSocket, msgReceived.substring(11)); } synchronized (chessPeerHash) { // 将主机设置为等待状态 chessPeerHash.put(gameCreaterName, "wait"); } Feedback("/yourname " + clientNameHash.get(clientSocket)); sendGamePeerMsg(gameCreaterName, "/OK"); sendPublicMsg(getUserList()); } else if (msgReceived.startsWith("/joingame ")) { // 收到的信息为加入游戏时 StringTokenizer userTokens = new StringTokenizer(msgReceived, " "); String userToken; String gameCreatorName; String gamePaticipantName; String[] playerNames = { "0", "0" }; int nameIndex = 0; while (userTokens.hasMoreTokens()) { userToken = (String) userTokens.nextToken(" "); if (nameIndex >= 1 && nameIndex <= 2) { playerNames[nameIndex - 1] = userToken; // 取得游戏者命 } nameIndex++; } gameCreatorName = playerNames[0]; gamePaticipantName = playerNames[1]; if (chessPeerHash.containsKey(gameCreatorName) && chessPeerHash.get(gameCreatorName).equals("wait")) { // 游戏已创建 synchronized (clientNameHash) { // 增加游戏加入者的套接口与名称的对应 clientNameHash.put(clientSocket, ("[inchess]" + gamePaticipantName)); } synchronized (chessPeerHash) { // 增加或修改游戏创建者与游戏加入者的名称的对应 chessPeerHash.put(gameCreatorName, gamePaticipantName); } sendPublicMsg(getUserList()); // 发送信息给游戏加入者 sendGamePeerMsg(gamePaticipantName, ("/peer " + "[inchess]" + gameCreatorName)); // 发送游戏给游戏创建者 sendGamePeerMsg(gameCreatorName, ("/peer " + "[inchess]" + gamePaticipantName)); } else { // 若游戏未创建则拒绝加入游戏 sendGamePeerMsg(gamePaticipantName, "/reject"); try { closeClient(); } catch (Exception ez) { ez.printStackTrace(); } } } else if (msgReceived.startsWith("/[inchess]")) { // 收到的信息为游戏中时 int firstLocation = 0, lastLocation; lastLocation = msgReceived.indexOf(" ", 0); peerName = msgReceived.substring((firstLocation + 1), lastLocation); msgReceived = msgReceived.substring((lastLocation + 1)); if (sendGamePeerMsg(peerName, msgReceived)) { Feedback("/error"); } } else if (msgReceived.startsWith("/giveup ")) { // 收到的信息为放弃游戏时 String chessClientName = msgReceived.substring(8); if (chessPeerHash.containsKey(chessClientName) && !((String) chessPeerHash.get(chessClientName)) .equals("wait")) { // 胜利方为游戏加入者,发送胜利信息 sendGamePeerMsg((String) chessPeerHash.get(chessClientName), "/youwin"); synchronized (chessPeerHash) { // 删除退出游戏的用户 chessPeerHash.remove(chessClientName); } } if (chessPeerHash.containsValue(chessClientName)) { // 胜利方为游戏创建者,发送胜利信息 sendGamePeerMsg((String) getHashKey(chessPeerHash, chessClientName), "/youwin"); synchronized (chessPeerHash) {// 删除退出游戏的用户 chessPeerHash.remove((String) getHashKey(chessPeerHash, chessClientName)); } } } else { // 收到的信息为其它信息时 int lastLocation = msgReceived.indexOf(" ", 0); if (lastLocation == -1) { Feedback("无效命令"); return; } } } else { msgReceived = clientNameHash.get(clientSocket) + ">" + msgReceived; serverMsgPanel.msgTextArea.append(msgReceived + "\n"); sendPublicMsg(msgReceived); serverMsgPanel.msgTextArea.setCaretPosition(serverMsgPanel.msgTextArea.getText() .length()); } } // 发送公开信息 public void sendPublicMsg(String publicMsg) { synchronized (clientDataHash) { for (Enumeration enu = clientDataHash.elements(); enu .hasMoreElements();) { DataOutputStream outputData = (DataOutputStream) enu.nextElement(); try { outputData.writeUTF(publicMsg); } catch (IOException es) { es.printStackTrace(); } } } } // 发送信息给指定的游戏中的用户 public boolean sendGamePeerMsg(String gamePeerTarget, String gamePeerMsg) { for (Enumeration enu = clientDataHash.keys(); enu.hasMoreElements();) { // 遍历以取得游戏中的用户的套接口 Socket userClient = (Socket) enu.nextElement(); if (gamePeerTarget.equals((String) clientNameHash.get(userClient)) && !gamePeerTarget.equals((String) clientNameHash .get(clientSocket))) { // 找到要发送信息的用户时 synchronized (clientDataHash) { // 建立输出流 DataOutputStream peerOutData = (DataOutputStream) clientDataHash .get(userClient); try { // 发送信息 peerOutData.writeUTF(gamePeerMsg); } catch (IOException es) { es.printStackTrace(); } } return false; } } return true; } // 发送反馈信息给连接到主机的人 public void Feedback(String feedBackMsg) { synchronized (clientDataHash) { DataOutputStream outputData = (DataOutputStream) clientDataHash .get(clientSocket); try { outputData.writeUTF(feedBackMsg); } catch (Exception eb) { eb.printStackTrace(); } } } // 取得用户列表 public String getUserList() { String userList = "/userlist"; for (Enumeration enu = clientNameHash.elements(); enu.hasMoreElements();) { userList = userList + " " + (String) enu.nextElement(); } return userList; } // 根据value值从Hashtable中取得相应的key public Object getHashKey(Hashtable targetHash, Object hashValue) { Object hashKey; for (Enumeration enu = targetHash.keys(); enu.hasMoreElements();) { hashKey = (Object) enu.nextElement(); if (hashValue.equals((Object) targetHash.get(hashKey))) return hashKey; } return null; } // 刚连接到主机时执行的方法 public void sendInitMsg() { sendPublicMsg(getUserList()); Feedback("/yourname " + (String) clientNameHash.get(clientSocket)); Feedback("Java 五子棋客户端"); Feedback("/list --更新用户列表"); Feedback("/--私聊"); Feedback("注意:命令必须对所有用户发送"); } public void closeClient() { serverMsgPanel.msgTextArea.append("用户断开连接:" + clientSocket + "\n"); synchronized (chessPeerHash) { //如果是游戏客户端主机 if (chessPeerHash.containsKey(clientNameHash.get(clientSocket))) { chessPeerHash.remove((String) clientNameHash.get(clientSocket)); } if (chessPeerHash.containsValue(clientNameHash.get(clientSocket))) { chessPeerHash.put((String) getHashKey(chessPeerHash, (String) clientNameHash.get(clientSocket)), "tobeclosed"); } } synchronized (clientDataHash) { // 删除客户数据 clientDataHash.remove(clientSocket); } synchronized (clientNameHash) { // 删除客户数据 clientNameHash.remove(clientSocket); } sendPublicMsg(getUserList()); serverMsgPanel.statusLabel.setText("当前连接数:" + clientDataHash.size()); try { clientSocket.close(); } catch (IOException exx) { exx.printStackTrace(); } isClientClosed = true; } public void run() { DataInputStream inputData; synchronized (clientDataHash) { serverMsgPanel.statusLabel.setText("当前连接数:" + clientDataHash.size()); } try { // 等待连接到主机的信息 inputData = new DataInputStream(clientSocket.getInputStream()); sendInitMsg(); while (true) { String message = inputData.readUTF(); dealWithMsg(message); } } catch (IOException esx){} finally { if (!isClientClosed) { closeClient(); } } } }
3.开发服务器端
import java.io.*; import java.net.*; import java.awt.*; import java.util.*; import java.awt.event.*; import javax.swing.JButton; /** * Created by Administrator on 2016/11/21. */ public class FIRServer extends Frame implements ActionListener{ JButton clearMsgButton = new JButton("清空列表"); JButton serverStatusButton = new JButton("服务器状态"); JButton closeServerButton = new JButton("关闭服务器"); Panel buttOnPanel= new Panel(); ServerMsgPanel serverMsgPanel = new ServerMsgPanel(); ServerSocket serverSocket; Hashtable clientDataHash = new Hashtable(50); //将客户端套接口和输出流绑定 Hashtable clientNameHash = new Hashtable(50); //将客户端套接口和客户名绑定 Hashtable chessPeerHash = new Hashtable(50); //将游戏创建者和游戏加入者绑定 public FIRServer() { super("Java 五子棋服务器"); setBackground(Color.LIGHT_GRAY); buttonPanel.setLayout(new FlowLayout()); clearMsgButton.setSize(60, 25); buttonPanel.add(clearMsgButton); clearMsgButton.addActionListener(this); serverStatusButton.setSize(75, 25); buttonPanel.add(serverStatusButton); serverStatusButton.addActionListener(this); closeServerButton.setSize(75, 25); buttonPanel.add(closeServerButton); closeServerButton.addActionListener(this); add(serverMsgPanel, BorderLayout.CENTER); add(buttonPanel, BorderLayout.SOUTH); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); pack(); setVisible(true); setSize(400, 300); setResizable(false); validate(); try { createServer(4331, serverMsgPanel); } catch (Exception e) { e.printStackTrace(); } } // 用指定端口和面板创建服务器 public void createServer(int port, ServerMsgPanel serverMsgPanel) throws IOException { Socket clientSocket; // 客户端套接口 long clientAccessNumber = 1; // 连接到主机的客户数量 this.serverMsgPanel = serverMsgPanel; // 设定当前主机 try { serverSocket = new ServerSocket(port); serverMsgPanel.msgTextArea.setText("服务器启动于:" + InetAddress.getLocalHost() + ":" //djr + serverSocket.getLocalPort() + "\n"); while (true) { // 监听客户端套接口的信息 clientSocket = serverSocket.accept(); serverMsgPanel.msgTextArea.append("已连接用户:" + clientSocket + "\n"); // 建立客户端输出流 DataOutputStream outputData = new DataOutputStream(clientSocket .getOutputStream()); // 将客户端套接口和输出流绑定 clientDataHash.put(clientSocket, outputData); // 将客户端套接口和客户名绑定 clientNameHash .put(clientSocket, ("新玩家" + clientAccessNumber++)); // 创建并运行服务器端线程 FIRServerThread thread = new FIRServerThread(clientSocket, clientDataHash, clientNameHash, chessPeerHash, serverMsgPanel); thread.start(); } } catch (IOException ex) { ex.printStackTrace(); } } public void actionPerformed(ActionEvent e) { if (e.getSource() == clearMsgButton) { // 清空服务器信息 serverMsgPanel.msgTextArea.setText(""); } if (e.getSource() == serverStatusButton) { // 显示服务器信息 try { serverMsgPanel.msgTextArea.append("服务器信息:" + InetAddress.getLocalHost() + ":" + serverSocket.getLocalPort() + "\n"); } catch (Exception ee) { ee.printStackTrace(); } } if (e.getSource() == closeServerButton) { // 关闭服务器 System.exit(0); } } public static void main(String args[]) { FIRServer firServer = new FIRServer(); } }
下面开始编写客户端模块
1.开发客户端
import java.awt.*; import java.awt.event.*; import java.io.*; import java.net.*; import javax.swing.JFrame; import djr.chess.gui.UserChatPad; import djr.chess.gui.UserControlPad; import djr.chess.gui.UserInputPad; import djr.chess.gui.UserListPad; import djr.chess.pad.FIRPad; /** * Created by Administrator on 2016/11/21. */ public class FIRClient extends Frame implements ActionListener,KeyListener { // 客户端套接口 Socket clientSocket; // 数据输入流 DataInputStream inputStream; // 数据输出流 DataOutputStream outputStream; // 用户名 String chessClientName = null; // 主机地址 String host = null; // 主机端口 int port = 4331; // 是否在聊天 boolean isOnChat= false; // 是否在下棋 boolean isOnChess= false; // 游戏是否进行中 boolean isGameCOnnected= false; // 是否为游戏创建者 boolean isCreator = false; // 是否为游戏加入者 boolean isParticipant = false; // 用户列表区 UserListPad userListPad = new UserListPad(); // 用户聊天区 UserChatPad userChatPad = new UserChatPad(); // 用户操作区 UserControlPad userCOntrolPad= new UserControlPad(); // 用户输入区 UserInputPad userInputPad = new UserInputPad(); // 下棋区 FIRPad firPad = new FIRPad(); // 面板区 Panel southPanel = new Panel(); Panel northPanel = new Panel(); Panel centerPanel = new Panel(); Panel eastPanel = new Panel(); // 构造方法,创建界面 public FIRClient() { super("Java 五子棋客户端"); setLayout(new BorderLayout()); host = userControlPad.ipInputted.getText(); eastPanel.setLayout(new BorderLayout()); eastPanel.add(userListPad, BorderLayout.NORTH); eastPanel.add(userChatPad, BorderLayout.CENTER); eastPanel.setBackground(Color.LIGHT_GRAY); userInputPad.contentInputted.addKeyListener(this); firPad.host = userControlPad.ipInputted.getText(); centerPanel.add(firPad, BorderLayout.CENTER); centerPanel.add(userInputPad, BorderLayout.SOUTH); centerPanel.setBackground(Color.LIGHT_GRAY); userControlPad.connectButton.addActionListener(this); userControlPad.createButton.addActionListener(this); userControlPad.joinButton.addActionListener(this); userControlPad.cancelButton.addActionListener(this); userControlPad.exitButton.addActionListener(this); userControlPad.createButton.setEnabled(false); userControlPad.joinButton.setEnabled(false); userControlPad.cancelButton.setEnabled(false); southPanel.add(userControlPad, BorderLayout.CENTER); southPanel.setBackground(Color.LIGHT_GRAY); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { if (isOnChat) { // 聊天中 try { // 关闭客户端套接口 clientSocket.close(); } catch (Exception ed){} } if (isOnChess || isGameConnected) { // 下棋中 try { // 关闭下棋端口 firPad.chessSocket.close(); } catch (Exception ee){} } System.exit(0); } }); add(eastPanel, BorderLayout.EAST); add(centerPanel, BorderLayout.CENTER); add(southPanel, BorderLayout.SOUTH); pack(); setSize(670, 560); setVisible(true); setResizable(false); this.validate(); } // 按指定的IP地址和端口连接到服务器 public boolean connectToServer(String serverIP, int serverPort) throws Exception { try { // 创建客户端套接口 clientSocket = new Socket(serverIP, serverPort); // 创建输入流 inputStream = new DataInputStream(clientSocket.getInputStream()); // 创建输出流 outputStream = new DataOutputStream(clientSocket.getOutputStream()); // 创建客户端线程 FIRClientThread clientthread = new FIRClientThread(this); // 启动线程,等待聊天信息 clientthread.start(); isOnChat= true; return true; } catch (IOException ex) { userChatPad.chatTextArea .setText("不能连接!\n"); } return false; } // 客户端事件处理 public void actionPerformed(ActionEvent e) { if (e.getSource() == userControlPad.connectButton) { // 连接到主机按钮单击事件 host = firPad.host = userControlPad.ipInputted.getText(); // 取得主机地址 try { if (connectToServer(host, port)) { // 成功连接到主机时,设置客户端相应的界面状态 userChatPad.chatTextArea.setText(""); userControlPad.connectButton.setEnabled(false); userControlPad.createButton.setEnabled(true); userControlPad.joinButton.setEnabled(true); firPad.statusText.setText("连接成功,请等待!"); } } catch (Exception ei) { userChatPad.chatTextArea .setText("不能连接!\n"); } } if (e.getSource() == userControlPad.exitButton) { // 离开游戏按钮单击事件 if (isOnChat) { // 若用户处于聊天状态中 try { // 关闭客户端套接口 clientSocket.close(); } catch (Exception ed){} } if (isOnChess || isGameConnected) { // 若用户处于游戏状态中 try { // 关闭游戏端口 firPad.chessSocket.close(); } catch (Exception ee){} } System.exit(0); } if (e.getSource() == userControlPad.joinButton) { // 加入游戏按钮单击事件 String selectedUser = (String)userListPad.userList.getSelectedItem(); // 取得要加入的游戏 if (selectedUser == null || selectedUser.startsWith("[inchess]") || selectedUser.equals(chessClientName)) { // 若未选中要加入的用户,或选中的用户已经在游戏,则给出提示信息 firPad.statusText.setText("必须选择一个用户!"); } else { // 执行加入游戏的操作 try { if (!isGameConnected) { // 若游戏套接口未连接 if (firPad.connectServer(firPad.host, firPad.port)) { // 若连接到主机成功 isGameCOnnected= true; isOnChess= true; isParticipant = true; userControlPad.createButton.setEnabled(false); userControlPad.joinButton.setEnabled(false); userControlPad.cancelButton.setEnabled(true); firPad.firThread.sendMessage("/joingame " + (String)userListPad.userList.getSelectedItem() + " " + chessClientName); } } else { // 若游戏端口连接中 isOnChess= true; isParticipant = true; userControlPad.createButton.setEnabled(false); userControlPad.joinButton.setEnabled(false); userControlPad.cancelButton.setEnabled(true); firPad.firThread.sendMessage("/joingame " + (String)userListPad.userList.getSelectedItem() + " " + chessClientName); } } catch (Exception ee) { isGameCOnnected= false; isOnChess= false; isParticipant = false; userControlPad.createButton.setEnabled(true); userControlPad.joinButton.setEnabled(true); userControlPad.cancelButton.setEnabled(false); userChatPad.chatTextArea .setText("不能连接: \n" + ee); } } } if (e.getSource() == userControlPad.createButton) { // 创建游戏按钮单击事件 try { if (!isGameConnected) { // 若游戏端口未连接 if (firPad.connectServer(firPad.host, firPad.port)) { // 若连接到主机成功 isGameCOnnected= true; isOnChess= true; isCreator = true; userControlPad.createButton.setEnabled(false); userControlPad.joinButton.setEnabled(false); userControlPad.cancelButton.setEnabled(true); firPad.firThread.sendMessage("/creatgame " + "[inchess]" + chessClientName); } } else { // 若游戏端口连接中 isOnChess= true; isCreator = true; userControlPad.createButton.setEnabled(false); userControlPad.joinButton.setEnabled(false); userControlPad.cancelButton.setEnabled(true); firPad.firThread.sendMessage("/creatgame " + "[inchess]" + chessClientName); } } catch (Exception ec) { isGameCOnnected= false; isOnChess= false; isCreator = false; userControlPad.createButton.setEnabled(true); userControlPad.joinButton.setEnabled(true); userControlPad.cancelButton.setEnabled(false); ec.printStackTrace(); userChatPad.chatTextArea.setText("不能连接: \n" + ec); } } if (e.getSource() == userControlPad.cancelButton) { // 退出游戏按钮单击事件 if (isOnChess) { // 游戏中 firPad.firThread.sendMessage("/giveup " + chessClientName); firPad.setVicStatus(-1 * firPad.chessColor); userControlPad.createButton.setEnabled(true); userControlPad.joinButton.setEnabled(true); userControlPad.cancelButton.setEnabled(false); firPad.statusText.setText("请创建或加入游戏!"); } if (!isOnChess) { // 非游戏中 userControlPad.createButton.setEnabled(true); userControlPad.joinButton.setEnabled(true); userControlPad.cancelButton.setEnabled(false); firPad.statusText.setText("请创建或加入游戏!"); } isParticipant = isCreator = false; } } public void keyPressed(KeyEvent e) { TextField inputwords = (TextField) e.getSource(); if (e.getKeyCode() == KeyEvent.VK_ENTER) { // 处理回车按键事件 if (userInputPad.userChoice.getSelectedItem().equals("所有用户")) { // 给所有人发信息 try { // 发送信息 outputStream.writeUTF(inputwords.getText()); inputwords.setText(""); } catch (Exception ea) { userChatPad.chatTextArea .setText("不能连接到服务器!\n"); userListPad.userList.removeAll(); userInputPad.userChoice.removeAll(); inputwords.setText(""); userControlPad.connectButton.setEnabled(true); } } else { // 给指定人发信息 try { outputStream.writeUTF("/" + userInputPad.userChoice.getSelectedItem() + " " + inputwords.getText()); inputwords.setText(""); } catch (Exception ea) { userChatPad.chatTextArea .setText("不能连接到服务器!\n"); userListPad.userList.removeAll(); userInputPad.userChoice.removeAll(); inputwords.setText(""); userControlPad.connectButton.setEnabled(true); } } } } public void keyTyped(KeyEvent e) {} public void keyReleased(KeyEvent e) {} public static void main(String args[]) { FIRClient chessClient = new FIRClient(); } }
2.开发客户端线程
import java.io.IOException; import java.util.StringTokenizer; import javax.swing.DefaultListModel; import javax.swing.ListModel; /** * Created by Administrator on 2016/11/21. */ public class FIRClientThread extends Thread{ public FIRClient firClient; public FIRClientThread(FIRClient firClient) { this.firClient = firClient; } public void dealWithMsg(String msgReceived) { if (msgReceived.startsWith("/userlist ")) { // 若取得的信息为用户列表 StringTokenizer userToken = new StringTokenizer(msgReceived, " "); int userNumber = 0; // 清空客户端用户列表 firClient.userListPad.userList.removeAll(); // 清空客户端用户下拉框 firClient.userInputPad.userChoice.removeAll(); // 给客户端用户下拉框添加一个选项 firClient.userInputPad.userChoice.addItem("所有用户"); while (userToken.hasMoreTokens()) { // 当收到的用户信息列表中存在数据时 String user = (String) userToken.nextToken(" "); // 取得用户信息 if (userNumber > 0 && !user.startsWith("[inchess]")) { // 用户信息有效时 firClient.userListPad.userList.add(user);// 将用户信息添加到用户列表中 firClient.userInputPad.userChoice.addItem(user); // 将用户信息添加到用户下拉框中 } userNumber++; } firClient.userInputPad.userChoice.setSelectedIndex(0);// 下拉框默认选中所有人 } else if (msgReceived.startsWith("/yourname ")) { // 收到的信息为用户本名时 firClient.chessClientName = msgReceived.substring(10); // 取得用户本名 firClient.setTitle("Java 五子棋客户端 " + "用户名:" + firClient.chessClientName); // 设置程序Frame的标题 } else if (msgReceived.equals("/reject")) { // 收到的信息为拒绝用户时 try { firClient.firPad.statusText.setText("不能加入游戏!"); firClient.userControlPad.cancelButton.setEnabled(false); firClient.userControlPad.joinButton.setEnabled(true); firClient.userControlPad.createButton.setEnabled(true); } catch (Exception ef) { firClient.userChatPad.chatTextArea .setText("Cannot close!"); } firClient.userControlPad.joinButton.setEnabled(true); } else if (msgReceived.startsWith("/peer ")) { // 收到信息为游戏中的等待时 firClient.firPad.chessPeerName = msgReceived.substring(6); if (firClient.isCreator) { // 若用户为游戏建立者 firClient.firPad.chessColor = 1; // 设定其为黑棋先行 firClient.firPad.isMouseEnabled = true; firClient.firPad.statusText.setText("黑方下..."); } else if (firClient.isParticipant) { // 若用户为游戏加入者 firClient.firPad.chessColor = -1; // 设定其为白棋后性 firClient.firPad.statusText.setText("游戏加入,等待对手."); } } else if (msgReceived.equals("/youwin")) { // 收到信息为胜利信息 firClient.isOnChess= false; firClient.firPad.setVicStatus(firClient.firPad.chessColor); firClient.firPad.statusText.setText("对手退出"); firClient.firPad.isMouseEnabled = false; } else if (msgReceived.equals("/OK")) { // 收到信息为成功创建游戏 firClient.firPad.statusText.setText("游戏创建等待对手"); } else if (msgReceived.equals("/error")) { // 收到信息错误 firClient.userChatPad.chatTextArea.append("错误,退出程序.\n"); } else { firClient.userChatPad.chatTextArea.append(msgReceived + "\n"); firClient.userChatPad.chatTextArea.setCaretPosition( firClient.userChatPad.chatTextArea.getText().length()); } } public void run() { String message = ""; try { while (true) { // 等待聊天信息,进入wait状态 message = firClient.inputStream.readUTF(); dealWithMsg(message); } } catch (IOException es){} } }
至此,网络版五子棋就算是开发完成了。关于这么多类和包的关系如下图:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。