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

📄 wuziqiserver.java~63~

📁 是JB的2D网络游戏
💻 JAVA~63~
📖 第 1 页 / 共 2 页
字号:
package game2d;import javax.swing.*;import com.borland.jbcl.layout.*;import java.awt.*;import java.net.*;import java.util.*;import java.awt.event.*;import java.io.*;public class wuziqiServer extends JFrame{  XYLayout xYLayout1 = new XYLayout();  JLabel jLabel1 = new JLabel();  JScrollPane jScrollPane1 = new JScrollPane();  JTextArea jTextArea1 = new JTextArea();  JButton jButton1 = new JButton();  JButton jButton2 = new JButton();  JButton jButton3 = new JButton();  ServerSocket serverSocket;    //用于监听端口  Hashtable clientDataHash = new Hashtable(50);//存放客户连接信息  Hashtable clientNameHash = new Hashtable(50);//存放客户连接信息  Hashtable chessPeerHash = new Hashtable(50);//存放连机客户信息  public wuziqiServer() {    try {      jbInit();    }    catch(Exception e) {      e.printStackTrace();    } }  public static void main(String[] args) {    wuziqiServer wuziqiServer = new wuziqiServer();     }  private void jbInit() throws Exception {    jLabel1.setFont(new java.awt.Font("Dialog", 0, 12));    jLabel1.setText("当前连接数:");    this.getContentPane().setLayout(xYLayout1);    this.getContentPane().setBackground(Color.pink);    jTextArea1.setMaximumSize(new Dimension(2147483647, 2147483647));    jTextArea1.setVerifyInputWhenFocusTarget(true);    jTextArea1.setText("");    jScrollPane1.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);    jButton1.setText("清除显示");    jButton2.setText("服务器状态");    jButton3.setText("关闭服务器");    xYLayout1.setWidth(450);    xYLayout1.setHeight(461);    this.getContentPane().add(jLabel1, new XYConstraints(2, 8, 439, 27));    this.getContentPane().add(jScrollPane1, new XYConstraints(3, 43, 433, 330));    this.getContentPane().add(jButton2, new XYConstraints(181, 391, 98, 28));    this.getContentPane().add(jButton3, new XYConstraints(304, 391, 101, 26));    this.getContentPane().add(jButton1, new XYConstraints(75, 391, 88, 28));    jScrollPane1.getViewport().add(jTextArea1, null);    //关闭当前窗口时退出当前程序    addWindowListener(new WindowAdapter(){      public void windowClosing(WindowEvent e){        System.exit(0);      }    });    this.pack();    this.setVisible(true);    this.validate();    this.setTitle("五子棋服务端");    try{    makeMessageServer(4331);    }catch(IOException e){}  }   public void makeMessageServer(int port)throws IOException{      Socket clientSocket;      long clientAccessNumber = 1;       try{        //启动服务器端ServerSocket;        serverSocket = new ServerSocket(port);        //这里输出的是ServerSocket开始的机器和端口号;        jTextArea1.setText("服务器开始于:" +                                    serverSocket.getInetAddress().getLocalHost() +                                    ":" + serverSocket.getLocalPort() + "\n");        //循环等待用户的连接,返回连接客户的Socket,并保存到Hashtable中;        while (true){          clientSocket = serverSocket.accept();          jTextArea1.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,this);          thread.start();        }      }      catch (IOException ex) {        System.out.println("已经有服务器在运行. \n");      }   }} //含有该客户的Socket以及三个Hashtable表;使用messageTransfer(String message)进行消息的处理; class ServerThread extends Thread{   Socket clientSocket;   Hashtable clientDataHash;   Hashtable clientNameHash;   Hashtable chessPeerHash;   wuziqiServer server;   boolean isClientClosed = false;   ServerThread(Socket clientSocket, Hashtable clientDataHash,                Hashtable clientNameHash, Hashtable chessPeerHash,               wuziqiServer 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{          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));

⌨️ 快捷键说明

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