java五子棋游戏代码 .pdf





《java五子棋游戏代码 .pdf》由会员分享,可在线阅读,更多相关《java五子棋游戏代码 .pdf(38页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、package server;import java.io.*;import .*;import java.awt.*;import java.util.*;import java.awt.event.*;/*显示服务器及用户信息的Panel 类*/class MessageServerPanel extends Panel /主消息窗口TextArea messageBoard=new TextArea(,22,50,TextArea.SCROLLBARS_VERTICAL_ONLY);Label statusLabel=new Label(当前连接数:,Label.LEFT);Panel
2、boardPanel=new Panel();/主显示区Panel Panel statusPanel=new Panel();/连接状态Panel MessageServerPanel()setSize(350,300);setBackground(new Color(204,204,204);setLayout(new BorderLayout();boardPanel.setLayout(new FlowLayout();boardPanel.setSize(210,210);statusPanel.setLayout(new BorderLayout();statusPanel.set
3、Size(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;/Socket 与发送数据的流的映射名师资料总结-精品资料欢迎下载-名师
4、精心整理-第 1 页,共 38 页 -Hashtable clientNameHash;/Socket 与用户名的映射Hashtable chessPeerHash;/对弈的两个客户端用户名的映射MessageServerPanel server;boolean isClientClosed=false;/*服务器端线程的构造函数,用于初始化一些对象。*/ServerThread(Socket clientSocket,Hashtable clientDataHash,Hashtable clientNameHash,Hashtable chessPeerHash,MessageServerP
5、anel server)this.clientSocket=clientSocket;this.clientDataHash=clientDataHash;this.clientNameHash=clientNameHash;this.chessPeerHash=chessPeerHash;this.server=server;/*对客户端发来的消息处理的函数,处理后转发回客户端。处理消息的过程比较复杂,要针对很多种情况分别处理。*/public void messageTransfer(String message)String clientName,peerName;/命令处理/如果消息以
6、“/”开头,表明是命令消息。if(message.startsWith(/)/如果消息以“/list”开头,则将其回馈到客户端以更新用户列表if(message.equals(/list)Feedback(getUserList();/如果消息以/creatgame inchess 开头,则修改clientNameHash 映射/和 chessPeerHash映射。else if(message.startsWith(/creatgame inchess)/String chessServerName=message.substring(20);synchronized(clientNameH
7、ash)clientNameHash.put(clientSocket,message.substring(11);名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 38 页 -synchronized(chessPeerHash)/刚创建,等待其他人加入chessPeerHash.put(chessServerName,wait);Feedback(/yourname +clientNameHash.get(clientSocket);chessPeerTalk(chessServerName,/OK);publicTalk(getUserList();/如果消息以“/joing
8、ame”开头,则将消息的服务端名字和本地用户名提取出来,/然后修改clientNameHash 表和 chessPeerHash表。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
9、)userToken.nextToken();if(getOptNum=1&getOptNum +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.messag
10、eBoard.getText().length();/*发送公共消息的函数,将消息向每个客户端都发送一份*/public void publicTalk(String publicTalkMessage)synchronized(clientDataHash)/枚举遍历所有客户端输出流。for(Enumeration enu=clientDataHash.elements();enu.hasMoreElements();)DataOutputStream outData=(DataOutputStream)enu.nextElement();try /输出信息。这里会阻塞outData.wri
11、teUTF(publicTalkMessage);catch(IOException es)/打印异常堆栈。终止程序。es.printStackTrace();名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 38 页 -/*选择对象发送消息,参数peerTalk 为发送的用户名,后面的参数为发送的消息*/public boolean peerTalk(String peerTalk,String talkMessage)/for(Enumeration enu=clientDataHash.keys();enu.hasMoreElements();)Socket userClie
12、nt=(Socket)enu.nextElement();/找到发送消息的对象,获取它的输出流以发送消息if(peerTalk.equals(String)clientNameHash.get(userClient)&!peerTalk.equals(String)clientNameHash.get(clientSocket)synchronized(clientDataHash)DataOutputStream peerOutData=(DataOutputStream)clientDataHash.get(userClient);try peerOutData.writeUTF(talk
13、Message);catch(IOException es)es.printStackTrace();Feedback(talkMessage);return(false);/如果是发给自己的,直接回馈else if(peerTalk.equals(String)clientNameHash.get(clientSocket)Feedback(talkMessage);return(false);return(true);/*此函数也用于选择发送消息,但不能发送给自己。*/public boolean chessPeerTalk(String chessPeerTalk,String ches
14、sTalkMessage)for(Enumeration enu=clientDataHash.keys();enu.hasMoreElements();)Socket userClient=(Socket)enu.nextElement();if(chessPeerTalk.equals(String)clientNameHash.get(userClient)名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页,共 38 页 -&!chessPeerTalk.equals(String)clientNameHash.get(clientSocket)synchronized(clien
15、tDataHash)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)/得到输出流。DataOut
16、putStream outData=(DataOutputStream)clientDataHash.get(clientSocket);try /输出信息。outData.writeUTF(feedbackString);catch(Exception eb)/打印堆栈轨迹,程序终止。eb.printStackTrace();/*获取用户列表的函数,此函数读取clientNameHash 获取用户列表,然后将其保存在一个字符串userList 中。*/public String getUserList()String userList=/userlist;/遍历 hashtable中的 va
17、lues,以空格分割连接起来for(Enumeration enu=clientNameHash.elements();enu.hasMoreElements();)userList=userList+(String)enu.nextElement();名师资料总结-精品资料欢迎下载-名师精心整理-第 7 页,共 38 页 -return userList;/*给出 HashTable 和值对象,获取相对应得键值的函数。*/public Object getHashKey(Hashtable targetHash,Object hashValue)Object hashKey;for(Enum
18、eration enu=targetHash.keys();enu.hasMoreElements();)hashKey=(Object)enu.nextElement();/如果键对应的值与hashValue相等,则返回这个key if(hashValue.equals(Object)targetHash.get(hashKey)return(hashKey);return(null);public void firstCome()/新用户第一次加入、广播用户列表。publicTalk(getUserList();/反馈给这个用户,以修改相应显示信息。Feedback(/yourname +
19、(String)clientNameHash.get(clientSocket);Feedback(Java 五子棋聊天客户端);Feedback(/changename -更改名字);Feedback(/list-更新用户列表);Feedback(/-私聊);Feedback(注意:用命令的时候,先把谈话的对象定为所有人);/*用于和客户端断开的函数。*/public void clientClose()server.messageBoard.append(用户断开:+clientSocket+n);/如果是游戏客户端主机synchronized(chessPeerHash)if(chess
20、PeerHash.containsKey(clientNameHash.get(clientSocket)chessPeerHash.remove(String)clientNameHash.get(clientSocket);if(chessPeerHash.containsValue(clientNameHash.get(clientSocket)chessPeerHash.put(String)getHashKey(chessPeerHash,(String)clientNameHash.get(clientSocket),tobeclosed);名师资料总结-精品资料欢迎下载-名师精心
21、整理-第 8 页,共 38 页 -/将保留的HashTable 里的数据清除synchronized(clientDataHash)clientDataHash.remove(clientSocket);synchronized(clientNameHash)clientNameHash.remove(clientSocket);/广播更新用户列表。publicTalk(getUserList();/计算当前连接数,并显示在状态框中server.statusLabel.setText(当前连接数:+clientDataHash.size();try clientSocket.close();c
22、atch(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(mes
23、sage);catch(IOException esx)finally if(!isClientClosed)clientClose();/*author wufenghanren 服务器端框架类*/名师资料总结-精品资料欢迎下载-名师精心整理-第 9 页,共 38 页 -public class chessServer extends Frame implements ActionListener Button messageClearButton=new Button(清除显示);Button serverStatusButton=new Button(服务器状态);Button serv
24、erOffButton=new Button(关闭服务器);Panel buttonPanel=new Panel();MessageServerPanel server=new MessageServerPanel();ServerSocket serverSocket;Hashtable clientDataHash=new Hashtable(50);Hashtable clientNameHash=new Hashtable(50);Hashtable chessPeerHash=new Hashtable(50);/*框架类的构造函数*/chessServer()super(Java
25、 五子棋服务器);setBackground(new Color(204,204,204);buttonPanel.setLayout(new FlowLayout();messageClearButton.setSize(60,25);buttonPanel.add(messageClearButton);messageClearButton.addActionListener(this);serverStatusButton.setSize(75,25);buttonPanel.add(serverStatusButton);serverStatusButton.addActionList
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java五子棋游戏代码 2022 java 五子棋 游戏 代码

限制150内