📄 wuziqiserver.java~63~
字号:
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 + -