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

📄 chessserver.java~234~

📁 是JB的2D网络游戏
💻 JAVA~234~
📖 第 1 页 / 共 2 页
字号:
      }
    }
  }
  //私聊信息,把talkMessage字符串转发给名字为peerTalk的用户;
  //所谓转发直接调用名字为peerTalk的socket的输出流,把信息;
  //使用wirteUTF(String)发送即可;并且发送给自己反馈信息;
  public boolean peerTalk(String peerTalk, String talkMessage){
    for(Enumeration enu = clientDataHash.keys(); enu.hasMoreElements();){
      Socket userClient = (Socket)enu.nextElement();
      //判断peerTalk字符串和clientNameHash中的某个用户名字是否一样,
      //同时不能和当前用户的名字一样;
      if(peerTalk.equals((String)clientNameHash.get(userClient))&&
          !peerTalk.equals((String)clientNameHash.get(clientSocket))){
        synchronized (clientDataHash){
          DataOutputStream peerOutData = (DataOutputStream)clientDataHash.get(userClient);
          try{
            peerOutData.writeUTF(talkMessage);
          }
          catch (IOException es){
            es.printStackTrace();
          }
        }
        Feedback(talkMessage);
        return (false);
      }
      else if (peerTalk.equals( (String) clientNameHash.get(clientSocket))) {
        Feedback(talkMessage);
        return (false);
      }
    }
    return (true);
  }
  //和peerTalk()代码相同,给对应的chesspeerTalk发送信息chessTalkMessage;
  public boolean chessPeerTalk(String chessPeerTalk, String chessTalkMessage){
    for (Enumeration enu = clientDataHash.keys(); enu.hasMoreElements();){
      Socket userClient = (Socket) enu.nextElement();
      if(chessPeerTalk.equals((String) clientNameHash.get(userClient)) &&
          !chessPeerTalk.equals((String) clientNameHash.get(clientSocket))){
        synchronized (clientDataHash){
          DataOutputStream peerOutData = (DataOutputStream) clientDataHash.get(
              userClient);
          try{
            peerOutData.writeUTF(chessTalkMessage);
          }
          catch (IOException es){
            es.printStackTrace();
          }
        }
        return (false);
      }
    }
    return (true);
  }
 //字符串反馈给当前用户;
  public void Feedback(String feedbackString){
    synchronized (clientDataHash){
      DataOutputStream outData = (DataOutputStream) clientDataHash.get(
          clientSocket);
      try {
        outData.writeUTF(feedbackString);
      }
      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);
  }
  //根据Hashtable表的Value获得其Key;
  public Object getHashKey(Hashtable targetHash, Object hashValue){
    Object hashKey;
    //遍历Hashtable中的每对元素,选择与hashValue对象值相等的Key;
    for(Enumeration enu = targetHash.keys(); enu.hasMoreElements();){
      hashKey = (Object)enu.nextElement();
      if(hashValue.equals((Object)targetHash.get(hashKey)))
        return (hashKey);
    }
    return (null);
  }
  public void firstCome(){
    publicTalk(getUserList());
    Feedback("/yourname " + (String)clientNameHash.get(clientSocket));
    Feedback("Java五子棋聊天客户端");
    Feedback("/changename <你的名字> --更改名字");
    Feedback("/list --更新用户列表");
    Feedback("/<用户名> <要说的话> --私聊");
    Feedback("注意:用命令的时候,先把谈话的对象定为所有人");
  }
  public void clientClose(){
    server.messageBoard.append("用户断开:" + clientSocket + "\n");
    //如果是游戏客户端主机,直接从chessPeerHash把该对元素移出
    synchronized (chessPeerHash){
      if (chessPeerHash.containsKey(clientNameHash.get(clientSocket))){
        chessPeerHash.remove((String) clientNameHash.get(clientSocket));
      }
      //如果是游戏客户端从机,则把其对应的主机对应元素设置成"tobeclosed"
      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);
    }
    publicTalk(getUserList());
    server.statusLabel.setText("当前连接数:" + clientDataHash.size());
    try {
      clientSocket.close();
    }
    catch (IOException exx) {
    }
    isClientClosed = true;
  }
  public void run(){
    DataInputStream inData;
    synchronized (clientDataHash){
      server.statusLabel.setText("当前连接数:" + clientDataHash.size());
    }
    try {
      inData = new DataInputStream(clientSocket.getInputStream());
      firstCome();
      while(true){
        String message = inData.readUTF();
        messageTransfer(message);
      }
    }
    catch(IOException esx){
    }
    finally{
      if(!isClientClosed){
        clientClose();
      }
    }
  }
}
public class chessServer   extends Frame  implements ActionListener{
  Button messageClearButton = new Button("清除显示");
  Button serverStatusButton = new Button("服务器状态");
  Button serverOffButton = new Button("关闭服务器");
  Panel buttonPanel = new Panel();
  MessageServer server = new MessageServer();
  ServerSocket serverSocket;
  Hashtable clientDataHash = new Hashtable(50);
  Hashtable clientNameHash = new Hashtable(50);
  Hashtable chessPeerHash = new Hashtable(50);
  //服务端的图形用户界面
   chessServer(){
    super("Java五子棋服务器");
    setBackground(Color.pink);
    buttonPanel.setLayout(new FlowLayout());
    messageClearButton.setSize(60, 25);
    buttonPanel.add(messageClearButton);
    messageClearButton.addActionListener(this);
    serverStatusButton.setSize(75, 25);
    buttonPanel.add(serverStatusButton);
    serverStatusButton.addActionListener(this);
    serverOffButton.setSize(75, 25);
    buttonPanel.add(serverOffButton);
    serverOffButton.addActionListener(this);
    add(server, BorderLayout.CENTER);
    add(buttonPanel, BorderLayout.SOUTH);
    addWindowListener(new WindowAdapter(){
      public void windowClosing(WindowEvent e){
        System.exit(0);
      }
    });
    pack();
    setVisible(true);
    setSize(400, 450);
    setResizable(false);
    validate();
    try {
      //启动服务器ServerSocket,并在4331端口监听
      makeMessageServer(4331, server);
    }
    catch (Exception e){
      System.out.println("e");
    }
  }
  // 在4331端口启动服务端ServerSocket
  public void makeMessageServer(int port, MessageServer server)throws IOException{
    Socket clientSocket;
    long clientAccessNumber = 1;
    this.server = server;
    try{
      //启动服务器端ServerSocket;
      serverSocket = new ServerSocket(port);
      //这里输出的是ServerSocket开始的机器和端口号;
      server.messageBoard.setText("服务器开始于:" +
                                  serverSocket.getInetAddress().getLocalHost() +
                                  ":" + serverSocket.getLocalPort() + "\n");
      //循环等待用户的连接,返回连接客户的Socket,并保存到Hashtable中;
      while(true){
        clientSocket = serverSocket.accept();
        server.messageBoard.append("用户连接:" + clientSocket + "\n");
        //??为什么需要将从clientSocket获得的输出流和自己做到Hashtable中呢???
        DataOutputStream outData = new DataOutputStream(clientSocket.getOutputStream());
        clientDataHash.put(clientSocket, outData);
        clientNameHash.put(clientSocket, ("新来客" + clientAccessNumber++));
        //产生特定客户的Socket以及DataOutputStream,
        //并加入到clientDataHash和clientNameHash中
        //针对这个用户启动一个服务端的线程负责具体的客户
        ServerThread thread = new ServerThread(clientSocket, clientDataHash,
                                               clientNameHash, chessPeerHash,
                                               server);
        thread.start();
      }
    }
    catch (IOException ex) {
      System.out.println("已经有服务器在运行. \n");
    }
  }
  public void actionPerformed(ActionEvent e) {
    if (e.getSource() == messageClearButton) {
      server.messageBoard.setText("");
    }
    if (e.getSource() == serverStatusButton) {
      try {
        server.messageBoard.append("服务器信息:" +
                                   serverSocket.getInetAddress().getLocalHost() +
                                   ":" + serverSocket.getLocalPort() + "\n");
      }
      catch (Exception ee) {
        System.out.println(
            "serverSocket.getInetAddress().getLocalHost() error \n");
      }
    }
    if (e.getSource() == serverOffButton) {
      System.exit(0);
    }
  }
  public static void main(String args[]) {
    chessServer chessServer = new chessServer();
  }
}

⌨️ 快捷键说明

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