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

📄 chessserver.java~234~

📁 是JB的2D网络游戏
💻 JAVA~234~
📖 第 1 页 / 共 2 页
字号:
import java.io.*;
import java.net.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
//MessageServer类作用为Panel,里面含有状态栏和消息回应框
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);
  }
}
//含有该客户的Socket以及三个Hashtable表;使用messageTransfer(String message)进行消息的处理;
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;
    System.out.println("客户端"+(String)clientNameHash.get(clientSocket)+"发送过来的消息为:"+message);
    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{
          //一个用户有两个Socket,首先判断是第一个socket发出消息,判断是否参加了游戏,需要把参加了游戏的socket的名字更改
          //哪个socket接受消息,如果是第一个socket接受的,则
          //需要更改[inchess]的客户名;
         /* if(clientNameHash.containsValue(("[inchess]" +
                                             (String)
                                             clientNameHash.get(clientSocket))))
          {
            synchronized(clientNameHash){
              clientNameHash.put((Socket)getHashKey(clientNameHash,("[inchess]" + clientNameHash.get(clientSocket))),
                                 ("[inchess]" + clientName));
              System.out.println("更改客户端的名字第一次");
              chessPeerTalk(("[inchess]" + clientName),("/yourname " + ("[inchess]" + clientName)));
             }
          }*/
          //如果为[inchess]客户发出的消息,clientNamHash中不包含[inchess]+客户名,判断是否为主机;
          //更改名字是否会影响到另外一个socket的名字呢?
          //else
          if(chessPeerHash.containsKey(clientNameHash.get(clientSocket))){
          //游戏客户端改名字
            synchronized (clientNameHash){
              clientNameHash.put((Socket)getHashKey(clientNameHash,
                  ("[inchess]" + clientNameHash.get(clientSocket))),
                                 ("[inchess]" + clientName));
              System.out.println("主机名字更改");
            }
            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));
            }
            System.out.println("客户端名字更改");
            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());
    }
  }
  //向客户端发送数据,直接从clientDataHash中取出
  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();
        }

⌨️ 快捷键说明

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