⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chessserver.java

📁 一个可以联机的五子棋代码 JAVA语言编写 分为服务器端和客户端
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
package test.game;

import java.io.*;
import java.net.*;
import java.awt.*;
import java.util.*;
import java.awt.event.*;

class MessageServer extends Panel // implements ActionListener
{
  TextArea messageBoard = new TextArea("", 22, 50, TextArea.SCROLLBARS_VERTICAL_ONLY);

  Label statusLabel = new Label("当前连接数:", Label.LEFT);

  Panel boardPanel = new Panel();

  Panel statusPanel = new Panel();

  MessageServer() {
    setSize(350, 300);
    setBackground(Color.pink);
    setLayout(new BorderLayout());
    boardPanel.setLayout(new FlowLayout());
    boardPanel.setSize(210, 210);
    statusPanel.setLayout(new BorderLayout());
    statusPanel.setSize(210, 50);
    boardPanel.add(messageBoard);
    statusPanel.add(statusLabel, BorderLayout.WEST);
    add(boardPanel, BorderLayout.CENTER);
    add(statusPanel, BorderLayout.NORTH);
  }
}

class ServerThread extends Thread {
  Socket clientSocket;

  Hashtable clientDataHash;

  Hashtable clientNameHash;

  Hashtable chessPeerHash;

  MessageServer server;

  boolean isClientClosed = false;

  ServerThread(Socket clientSocket, Hashtable clientDataHash, Hashtable clientNameHash, Hashtable chessPeerHash,
      MessageServer server) {
    this.clientSocket = clientSocket;
    this.clientDataHash = clientDataHash;
    this.clientNameHash = clientNameHash;
    this.chessPeerHash = chessPeerHash;
    this.server = server;
  }

  public void messageTransfer(String message) {
    String clientName, peerName;
    if (message.startsWith("/")) {
      if (message.startsWith("/changename ")) {
        clientName = message.substring(12);
        if (clientName.length() <= 0 || clientName.length() > 20 || clientName.startsWith("/")
            || clientNameHash.containsValue(clientName) || clientName.startsWith("changename") || clientName.startsWith("list")
            || clientName.startsWith("[inchess]") || clientName.startsWith("creatgame") || clientName.startsWith("joingame")
            || clientName.startsWith("yourname") || clientName.startsWith("userlist") || clientName.startsWith("chess")
            || clientName.startsWith("OK") || clientName.startsWith("reject") || clientName.startsWith("peer")
            || clientName.startsWith("peername") || clientName.startsWith("giveup") || clientName.startsWith("youwin")
            || clientName.startsWith("所有人")) {
          message = "无效命令";
          Feedback(message);
        } else {
          if (clientNameHash.containsValue(("[inchess]" + (String) clientNameHash.get(clientSocket)))) {
            synchronized (clientNameHash) {
              clientNameHash.put((Socket) getHashKey(clientNameHash, ("[inchess]" + clientNameHash.get(clientSocket))),
                  ("[inchess]" + clientName));
              chessPeerTalk(("[inchess]" + clientName), ("/yourname " + ("[inchess]" + clientName)));
            }
          } else if (chessPeerHash.containsKey(clientNameHash.get(clientSocket))) {
            // 游戏客户端改名字
            synchronized (clientNameHash) {
              clientNameHash.put((Socket) getHashKey(clientNameHash, ("[inchess]" + clientNameHash.get(clientSocket))),
                  ("[inchess]" + clientName));
            }
            synchronized (chessPeerHash) {
              // chessPeerHash添加新名字映射
              chessPeerHash.put(clientName, chessPeerHash.get(clientNameHash.get(clientSocket)));
              // chessPeerHash删除旧映射
              chessPeerHash.remove(clientNameHash.get(clientSocket));
            }
            // 向游戏客户端发送新名字
            chessPeerTalk(("[inchess]" + clientName), ("/yourname " + ("[inchess]" + clientName)));
            // 向peer游戏客户端发送
            chessPeerTalk((String) chessPeerHash.get(clientName), ("/peer " + "[inchess]" + clientName));
          } else if (chessPeerHash.containsValue(clientNameHash.get(clientSocket))) {
            synchronized (clientNameHash) {
              // 游戏客户端改名字
              clientNameHash.put((Socket) getHashKey(clientNameHash, ("[inchess]" + clientNameHash.get(clientSocket))),
                  ("[inchess]" + clientName));
            }
            synchronized (chessPeerHash) {
              // chessPeerHash重新映射
              chessPeerHash.put((String) getHashKey(chessPeerHash, clientNameHash.get(clientSocket)), clientName);
              // 向游戏客户端发送新名字
              chessPeerTalk(("[inchess]" + clientName), ("/yourname " + ("[inchess]" + clientName)));
            }
            // 向peer游戏客户端发送
            chessPeerTalk((String) getHashKey(chessPeerHash, clientName), ("/peer " + "[inchess]" + clientName));
          }
          message = clientNameHash.get(clientSocket) + "改名为:" + clientName;
          synchronized (clientNameHash) {
            clientNameHash.put(clientSocket, clientName);
          }
          publicTalk(message);
          Feedback("/yourname " + (String) clientNameHash.get(clientSocket));
          publicTalk(getUserList());
        }
      } else if (message.equals("/list")) {
        Feedback(getUserList());
      } else if (message.startsWith("/creatgame [inchess]")) {
        String chessServerName = message.substring(20);
        synchronized (clientNameHash) {
          clientNameHash.put(clientSocket, message.substring(11));
        }
        synchronized (chessPeerHash) {
          chessPeerHash.put(chessServerName, "wait");
        }
        Feedback("/yourname " + clientNameHash.get(clientSocket));
        chessPeerTalk(chessServerName, "/OK");
        publicTalk(getUserList());
      } else if (message.startsWith("/joingame ")) {
        StringTokenizer userToken = new StringTokenizer(message, " ");
        String getUserToken, serverName, selfName;
        String[] chessNameOpt = { "0", "0" };
        int getOptNum = 0;
        while (userToken.hasMoreTokens()) {
          getUserToken = (String) userToken.nextToken(" ");
          if (getOptNum >= 1 && getOptNum <= 2) {
            chessNameOpt[getOptNum - 1] = getUserToken;
          }
          getOptNum++;
        }
        serverName = chessNameOpt[0];
        selfName = chessNameOpt[1];
        if (chessPeerHash.containsKey(serverName) && chessPeerHash.get(serverName).equals("wait")) {
          synchronized (clientNameHash) {
            clientNameHash.put(clientSocket, ("[inchess]" + selfName));
          }
          synchronized (chessPeerHash) {
            chessPeerHash.put(serverName, selfName);
          }
          publicTalk(getUserList());
          chessPeerTalk(selfName, ("/peer " + "[inchess]" + serverName));
          chessPeerTalk(serverName, ("/peer " + "[inchess]" + selfName));
        } else {
          chessPeerTalk(selfName, "/reject");
          try {
            clientClose();
          } catch (Exception ez) {}
        }
      } else if (message.startsWith("/[inchess]")) {
        int firstLocation = 0, lastLocation;
        lastLocation = message.indexOf(" ", 0);
        peerName = message.substring((firstLocation + 1), lastLocation);
        message = message.substring((lastLocation + 1));
        if (chessPeerTalk(peerName, message)) {
          Feedback("/error");
        }
      } else if (message.startsWith("/giveup ")) {
        String chessClientName = message.substring(8);
        if (chessPeerHash.containsKey(chessClientName) && !((String) chessPeerHash.get(chessClientName)).equals("wait")) {
          chessPeerTalk((String) chessPeerHash.get(chessClientName), "/youwin");
          synchronized (chessPeerHash) {
            chessPeerHash.remove(chessClientName);
          }
        }
        if (chessPeerHash.containsValue(chessClientName)) {
          chessPeerTalk((String) getHashKey(chessPeerHash, chessClientName), "/youwin");
          synchronized (chessPeerHash) {
            chessPeerHash.remove((String) getHashKey(chessPeerHash, chessClientName));
          }
        }
      } else {
        int firstLocation = 0, lastLocation;
        lastLocation = message.indexOf(" ", 0);
        if (lastLocation == -1) {
          Feedback("无效命令");
          return;
        } else {
          peerName = message.substring((firstLocation + 1), lastLocation);
          message = message.substring((lastLocation + 1));
          message = (String) clientNameHash.get(clientSocket) + ">" + message;
          if (peerTalk(peerName, message)) {
            Feedback("没有这个用户:" + peerName + "\n");
          }
        }
      }
    } else {
      message = clientNameHash.get(clientSocket) + ">" + message;
      server.messageBoard.append(message + "\n");
      publicTalk(message);
      server.messageBoard.setCaretPosition(server.messageBoard.getText().length());
    }
  }

  public void publicTalk(String publicTalkMessage) {
    synchronized (clientDataHash) {
      for (Enumeration enu = clientDataHash.elements(); enu.hasMoreElements();) {
        DataOutputStream outData = (DataOutputStream) enu.nextElement();
        try {
          outData.writeUTF(publicTalkMessage);
        } catch (IOException es) {
          es.printStackTrace();
        }
      }
    }
  }

  public boolean peerTalk(String peerTalk, String talkMessage) {
    for (Enumeration enu = clientDataHash.keys(); enu.hasMoreElements();) {
      Socket userClient = (Socket) enu.nextElement();

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -