📄 chessserver.java~234~
字号:
import java.io.*;
import java.net.*;
import java.util.*;
import java.awt.*;
import java.awt.event.*;
//MessageServer类作用为Panel,里面含有状态栏和消息回应框
class MessageServer extends Panel{ //implements ActionListener
TextArea messageBoard = new TextArea("", 22, 50,
TextArea.SCROLLBARS_VERTICAL_ONLY);
Label statusLabel = new Label("当前连接数:", Label.LEFT);
Panel boardPanel = new Panel();
Panel statusPanel = new Panel();
MessageServer(){
setSize(350, 300);
setBackground(Color.pink);
setLayout(new BorderLayout());
boardPanel.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);
}
}
//含有该客户的Socket以及三个Hashtable表;使用messageTransfer(String message)进行消息的处理;
class ServerThread extends Thread{
Socket clientSocket;
Hashtable clientDataHash;
Hashtable clientNameHash;
Hashtable chessPeerHash;
MessageServer server;
boolean isClientClosed = false;
ServerThread(Socket clientSocket, Hashtable clientDataHash,
Hashtable clientNameHash, Hashtable chessPeerHash,
MessageServer 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{
//一个用户有两个Socket,首先判断是第一个socket发出消息,判断是否参加了游戏,需要把参加了游戏的socket的名字更改
//哪个socket接受消息,如果是第一个socket接受的,则
//需要更改[inchess]的客户名;
/* if(clientNameHash.containsValue(("[inchess]" +
(String)
clientNameHash.get(clientSocket))))
{
synchronized(clientNameHash){
clientNameHash.put((Socket)getHashKey(clientNameHash,("[inchess]" + clientNameHash.get(clientSocket))),
("[inchess]" + clientName));
System.out.println("更改客户端的名字第一次");
chessPeerTalk(("[inchess]" + clientName),("/yourname " + ("[inchess]" + clientName)));
}
}*/
//如果为[inchess]客户发出的消息,clientNamHash中不包含[inchess]+客户名,判断是否为主机;
//更改名字是否会影响到另外一个socket的名字呢?
//else
if(chessPeerHash.containsKey(clientNameHash.get(clientSocket))){
//游戏客户端改名字
synchronized (clientNameHash){
clientNameHash.put((Socket)getHashKey(clientNameHash,
("[inchess]" + clientNameHash.get(clientSocket))),
("[inchess]" + clientName));
System.out.println("主机名字更改");
}
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));
}
System.out.println("客户端名字更改");
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));
chessPeerTalk(serverName, ("/peer " + "[inchess]" + selfName));
}
else {
chessPeerTalk(selfName, "/reject");
try{
clientClose();
}
catch (Exception ez) {
}
}
}
else if(message.startsWith("/[inchess]")){
int firstLocation = 0, lastLocation;
lastLocation = message.indexOf(" ", 0);
peerName = message.substring((firstLocation + 1),lastLocation);
message = message.substring((lastLocation + 1));
if (chessPeerTalk(peerName, message)){
Feedback("/error");
}
}
else if (message.startsWith("/giveup ")){
String chessClientName = message.substring(8);
if(chessPeerHash.containsKey(chessClientName)&&
!((String) chessPeerHash.get(chessClientName)).equals("wait")){
chessPeerTalk( (String) chessPeerHash.get(chessClientName), "/youwin");
synchronized (chessPeerHash) {
chessPeerHash.remove(chessClientName);
}
}
if (chessPeerHash.containsValue(chessClientName)) {
chessPeerTalk( (String) getHashKey(chessPeerHash, chessClientName),
"/youwin");
synchronized (chessPeerHash) {
chessPeerHash.remove((String) getHashKey(chessPeerHash,
chessClientName));
}
}
}
else {
int firstLocation = 0, lastLocation;
lastLocation = message.indexOf(" ", 0);
if (lastLocation == -1) {
Feedback("无效命令");
return;
}
else {
peerName = message.substring( (firstLocation + 1), lastLocation);
message = message.substring( (lastLocation + 1));
message = (String) clientNameHash.get(clientSocket) + ">" + 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.messageBoard.getText().length());
}
}
//向客户端发送数据,直接从clientDataHash中取出
public void publicTalk(String publicTalkMessage){
synchronized (clientDataHash){
for(Enumeration enu = clientDataHash.elements();enu.hasMoreElements();){
DataOutputStream outData = (DataOutputStream)enu.nextElement();
try{
outData.writeUTF(publicTalkMessage);
}
catch(IOException es){
es.printStackTrace();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -