《网络版五子棋的java源代码》由会员分享,可在线阅读,更多相关《网络版五子棋的java源代码(45页珍藏版)》请在金锄头文库上搜索。
1、服务器端源代码: package org.shan.server;import java.awt.BorderLayout; import java.awt.Color;import java.awt.FlowLayout; import java.awt.Frame; import java.awt.Label;import java.awt.Panel; import java.awt.TextArea; import java.awt.event.ActionEvent;import java.awt.event.ActionListener; import java.awt.event
2、.WindowAdapter; import java.awt.event.WindowEvent;import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException;import .ServerSocket; import .Socket; import java.util.Enumeration;import java.util.Hashtable; import java.util.StringTokenizer;import javax.swing.JButton; im
3、port javax.swing.JLabel; import javax.swing.JPanel;import javax.swing.UIManager;import org.jvnet.substance.SubstanceLookAndFeel;import org.jvnet.substance.skin.SubstanceOfficeBlue2007LookAndFeel;/* 显示服务器及用户信息的 Panel 类 */ class MessageServerPanel extends Panel TextArea messageBoard = new TextArea(“,
4、22, 50, TextArea.SCROLLBARS_VERTICAL_ONLY);JLabel statusLabel = new JLabel(“当前连接数:“, Label.LEFT);JPanel boardPanel = new JPanel();/ 主显示区 PanelJPanel statusPanel = new JPanel();/ 连接状态 PanelMessageServerPanel() setSize(350, 300);setBackground(new Color(204, 204, 204); setLayout(new BorderLayout(); boa
5、rdPanel.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); /* * 服务器线程
6、,主要用于服务器与客户端的通信*/ class ServerThread extends Thread Socket clientSocket;Hashtable clientDataHash;/ Socket 与发送数据的流的映射Hashtable clientNameHash;/ Socket 与用户名的映射Hashtable chessPeerHash;/ 对弈的两个客户端用户名的映射MessageServerPanel server;boolean isClientClosed = false;/* 服务器端线程的构造函数,用于初始化一些对象。 */ ServerThread(Sock
7、et clientSocket, Hashtable clientDataHash,Hashtable clientNameHash, Hashtable chessPeerHash, MessageServerPanel server) this.clientSocket = clientSocket;this.clientDataHash = clientDataHash; this.clientNameHash = clientNameHash; this.chessPeerHash = chessPeerHash;this.server = server; /* * 对客户端发来的消息
8、处理的函数, 处理后转发回客户端。 处理消息的过程比较复杂,要针对很多种情况分别处理。 */ public void messageTransfer(String message) String clientName, peerName; / 如果消息以“/”开头,表明是命令消息。 if (message.startsWith(“/“) / 消息以“/changename”开头的几种情况. if (message.startsWith(“/r“) / 获取修改后的用户名clientName = message.substring(2); if (clientName.length() 20|c
9、lientName.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
10、“)|clientName.startsWith(“chess“)|clientName.startsWith(“OK“)|clientName.startsWith(“reject“)|clientName.startsWith(“peer“)|clientName.startsWith(“peername“)|clientName.startsWith(“giveup“)|clientName.startsWith(“youwin“)|clientName.startsWith(“所有人“) / 如果名字不合规则,则向客户端发送信息“无效命令” 。 message =“无效命令“;Feed
11、back(message); else if (clientNameHash.containsValue(“inchess“ + (String) clientNameHash .get(clientSocket) / 如果用户正在对弈中,则直接修改 Socket 和名字的映射 Hash表。 synchronized (clientNameHash) clientNameHash.put(Socket) getHashKey(clientNameHash, (“inchess“ + clientNameHash .get(clientSocket),(“inchess“ + clientNam
12、e); chessPeerTalk(“inchess“ + clientName),(“/yourname“+ (“inchess“ + clientName); / 如果用户在对弈双方的客户端,做如下处理。 else if (chessPeerHash.containsKey(clientNameHash .get(clientSocket) / 将客户端的新名字映射到 clientNameHash synchronized (clientNameHash) clientNameHash.put(Socket) getHashKey(clientNameHash, (“inchess“ +
13、clientNameHash .get(clientSocket),(“inchess“ + clientName); synchronized (chessPeerHash) / chessPeerHash 添加新名字映射 chessPeerHash.put(clientName, chessPeerHash.get(clientNameHash.get(clientSocket); / chessPeerHash 删除旧映射 chessPeerHash.remove(clientNameHash.get(clientSocket); / 向游戏客户端发送新名字chessPeerTalk(“
14、inchess“ + clientName), (“/yourname“+ (“inchess“ + clientName); / 向 peer 游戏客户端发送chessPeerTalk(String) chessPeerHash.get(clientName), (“/peer“+ “inchess“ + clientName); / 如果用户在对弈双方的服务端,做如下处理。 else if (chessPeerHash.containsValue(clientNameHash.get(clientSocket) synchronized (clientNameHash) / 游戏客户端改名
15、字clientNameHash.put(Socket) getHashKey( clientNameHash, (“inchess“ + clientNameHash.get(clientSocket), (“inchess“ + clientName); synchronized (chessPeerHash) / chessPeerHash 重新映射chessPeerHash.put(String) getHashKey( chessPeerHash, clientNameHash .get(clientSocket), clientName);/ 向游戏客户端发送新名字 chessPee
16、rTalk(“inchess“ + clientName), (“/yourname“+ (“inchess“ + clientName); / 向 peer 游戏客户端发送 chessPeerTalk(String) getHashKey(chessPeerHash,clientName), (“/peer“+ “inchess“ + clientName); / 将改名消息封装好以备发送 message = clientNameHash.get(clientSocket) +“改名为:“+ clientName; synchronized (clientNameHash) clientNameHash.put(cl