首页 > 编程 > Java > 正文

Java实现五子棋网络版

2019-11-26 10:09:04
字体:
来源:转载
供稿:网友

本文实例为大家分享了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("/<username> <talk> --私聊");     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){}   } } 

至此,网络版五子棋就算是开发完成了。关于这么多类和包的关系如下图:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持武林网。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表