下面的源代码分为4个文件; chessClient.java:客户端主程序。 chessInterface.java:客户端的界面。 chessPad.java:棋盘的绘制。 chessServer.java:服务器端。 可同时容纳50个人同时在线下棋,聊天。 没有加上详细注释,不过绝对可以运行,j2sdk1.4下通过。
/********************************************************************************************* 1.chessClient.java **********************************************************************************************/
import java.awt.*; import java.awt.event.*; import java.io.*; import java.net.*; import java.util.*;
class clientThread extends Thread { chessClient chessclient;
clientThread(chessClient chessclient) { this.chessclient=chessclient; }
public void acceptMessage(String recMessage) { if(recMessage.startsWith("/userlist ")) { StringTokenizer userToken=new StringTokenizer(recMessage," "); int userNumber=0;
chessclient.userpad.userList.removeAll(); chessclient.inputpad.userChoice.removeAll(); chessclient.inputpad.userChoice.addItem("所有人"); while(userToken.hasMoreTokens()) { String user=(String)userToken.nextToken(" "); if(userNumber>0 && !user.startsWith("[inchess]")) { chessclient.userpad.userList.add(user); chessclient.inputpad.userChoice.addItem(user); }
userNumber++; } chessclient.inputpad.userChoice.select("所有人"); } else if(recMessage.startsWith("/yourname ")) { chessclient.chessClientName=recMessage.substring(10); chessclient.setTitle("Java五子棋客户端 "+"用户名:"+chessclient.chessClientName); } else if(recMessage.equals("/reject")) { try { chessclient.chesspad.statusText.setText("不能加入游戏"); chessclient.controlpad.cancelGameButton.setEnabled(false); chessclient.controlpad.joinGameButton.setEnabled(true); chessclient.controlpad.creatGameButton.setEnabled(true); } catch(Exception ef) { chessclient.chatpad.chatLineArea.setText("chessclient.chesspad.chessSocket.close无法关闭"); } chessclient.controlpad.joinGameButton.setEnabled(true); } else if(recMessage.startsWith("/peer ")) { chessclient.chesspad.chessPeerName=recMessage.substring(6); if(chessclient.isServer) { chessclient.chesspad.chessColor=1; chessclient.chesspad.isMouseEnabled=true; chessclient.chesspad.statusText.setText("请黑棋下子"); } else if(chessclient.isClient) { chessclient.chesspad.chessColor=-1; chessclient.chesspad.statusText.setText("已加入游戏,等待对方下子..."); }
} else if(recMessage.equals("/youwin")) { chessclient.isOnChess=false; chessclient.chesspad.chessVictory(chessclient.chesspad.chessColor); chessclient.chesspad.statusText.setText("对方退出,请点放弃游戏退出连接"); chessclient.chesspad.isMouseEnabled=false; } else if(recMessage.equals("/OK")) { chessclient.chesspad.statusText.setText("创建游戏成功,等待别人加入..."); } else if(recMessage.equals("/error")) { chessclient.chatpad.chatLineArea.append("传输错误:请退出程序,重新加入 \n"); } else { chessclient.chatpad.chatLineArea.append(recMessage+"\n"); chessclient.chatpad.chatLineArea.setCaretPosition( chessclient.chatpad.chatLineArea.getText().length()); } }
public void run() { String message=""; try { while(true) { message=chessclient.in.readUTF(); acceptMessage(message); } } catch(IOException es) { } }
}
public class chessClient extends Frame implements ActionListener,KeyListener { userPad userpad=new userPad(); chatPad chatpad=new chatPad(); controlPad controlpad=new controlPad(); chessPad chesspad=new chessPad(); inputPad inputpad=new inputPad();
Socket chatSocket; DataInputStream in; DataOutputStream out; String chessClientName=null; String host=null; int port=4331;
boolean isOnChat=false; //在聊天? boolean isOnChess=false; //在下棋? boolean isGameConnected=false; //下棋的客户端连接? boolean isServer=false; //如果是下棋的主机 boolean isClient=false; //如果是下棋的客户端
Panel southPanel=new Panel(); Panel northPanel=new Panel(); Panel centerPanel=new Panel(); Panel westPanel=new Panel(); Panel eastPanel=new Panel();
chessClient() { super("Java五子棋客户端"); setLayout(new BorderLayout()); host=controlpad.inputIP.getText();
westPanel.setLayout(new BorderLayout()); westPanel.add(userpad,BorderLayout.NORTH); westPanel.add(chatpad,BorderLayout.CENTER); westPanel.setBackground(Color.pink);
inputpad.inputWords.addKeyListener(this); chesspad.host=controlpad.inputIP.getText();
centerPanel.add(chesspad,BorderLayout.CENTER); centerPanel.add(inputpad,BorderLayout.SOUTH); centerPanel.setBackground(Color.pink);
controlpad.connectButton.addActionListener(this); controlpad.creatGameButton.addActionListener(this); controlpad.joinGameButton.addActionListener(this); controlpad.cancelGameButton.addActionListener(this); controlpad.exitGameButton.addActionListener(this);
controlpad.creatGameButton.setEnabled(false); controlpad.joinGameButton.setEnabled(false); controlpad.cancelGameButton.setEnabled(false);
southPanel.add(controlpad,BorderLayout.CENTER); southPanel.setBackground(Color.pink);
addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { if(isOnChat) { try { chatSocket.close(); } catch(Exception ed) { } } if(isOnChess || isGameConnected) { try { chesspad.chessSocket.close(); } catch(Exception ee) { } } System.exit(0); } public void windowActivated(WindowEvent ea) {
} });
add(westPanel,BorderLayout.WEST); add(centerPanel,BorderLayout.CENTER); add(southPanel,BorderLayout.SOUTH);
pack(); setSize(670,548); setVisible(true); setResizable(false); validate(); }
public boolean connectServer(String serverIP,int serverPort) throws Exception { try { chatSocket=new Socket(serverIP,serverPort); in=new DataInputStream(chatSocket.getInputStream()); out=new DataOutputStream(chatSocket.getOutputStream());
clientThread clientthread=new clientThread(this); clientthread.start(); isOnChat=true; return true; } catch(IOException ex) { chatpad.chatLineArea.setText("chessClient:connectServer:无法连接,建议重新启动程序 \n"); } return false; }
public void actionPerformed(ActionEvent e) { if(e.getSource()==controlpad.connectButton) { host=chesspad.host=controlpad.inputIP.getText(); try { if(connectServer(host,port)) { chatpad.chatLineArea.setText(""); controlpad.connectButton.setEnabled(false); controlpad.creatGameButton.setEnabled(true); controlpad.joinGameButton.setEnabled(true); chesspad.statusText.setText("连接成功,请创建游戏或加入游戏"); }
} catch(Exception ei) { chatpad.chatLineArea.setText("controlpad.connectButton:无法连接,建议重新启动程序 \n"); } } if(e.getSource()==controlpad.exitGameButton) { if(isOnChat) { try { chatSocket.close(); } catch(Exception ed) { } } if(isOnChess || isGameConnected) { try { chesspad.chessSocket.close(); } catch(Exception ee) { } } System.exit(0);
} if(e.getSource()==controlpad.joinGameButton) { String selectedUser=userpad.userList.getSelectedItem(); if(selectedUser==null || selectedUser.startsWith("[inchess]") || selectedUser.equals(chessClientName)) { chesspad.statusText.setText("必须先选定一个有效用户"); } else { try { if(!isGameConnected) { if(chesspad.connectServer(chesspad.host,chesspad.port)) { isGameConnected=true; isOnChess=true; isClient=true; controlpad.creatGameButton.setEnabled(false); controlpad.joinGameButton.setEnabled(false); controlpad.cancelGameButton.setEnabled(true); chesspad.chessthread.sendMessage("/joingame "+userpad.userList.getSelectedItem()+" "+chessClientName); } } else { isOnChess=true; isClient=true; controlpad.creatGameButton.setEnabled(false); controlpad.joinGameButton.setEnabled(false); controlpad.cancelGameButton.setEnabled(true); chesspad.chessthread.sendMessage("/joingame "+userpad.userList.getSelectedItem()+" "+chessClientName); }
} catch(Exception ee) { isGameConnected=false; isOnChess=false; isClient=false; controlpad.creatGameButton.setEnabled(true); controlpad.joinGameButton.setEnabled(true); controlpad.cancelGameButton.setEnabled(false); chatpad.chatLineArea.setText("chesspad.connectServer无法连接 \n"+ee); }
} } if(e.getSource()==controlpad.creatGameButton) { try { if(!isGameConnected) { if(chesspad.connectServer(chesspad.host,chesspad.port)) { isGameConnected=true; isOnChess=true; isServer=true; controlpad.creatGameButton.setEnabled(false); controlpad.joinGameButton.setEnabled(false); controlpad.cancelGameButton.setEnabled(true); chesspad.chessthread.sendMessage("/creatgame "+"[inchess]"+chessClientName); } } else { isOnChess=true; isServer=true; controlpad.creatGameButton.setEnabled(false); controlpad.joinGameButton.setEnabled(false); controlpad.cancelGameButton.setEnabled(true); chesspad.chessthread.sendMessage("/creatgame "+"[inchess]"+chessClientName); } } catch(Exception ec) { isGameConnected=false; isOnChess=false; isServer=false; controlpad.creatGameButton.setEnabled(true); controlpad.joinGameButton.setEnabled(true); controlpad.cancelGameButton.setEnabled(false); ec.printStackTrace(); chatpad.chatLineArea.setText("chesspad.connectServer无法连接 \n"+ec); }
} if(e.getSource()==controlpad.cancelGameButton) { if(isOnChess) { chesspad.chessthread.sendMessage("/giveup "+chessClientName); chesspad.chessVictory(-1*chesspad.chessColor); controlpad.creatGameButton.setEnabled(true); controlpad.joinGameButton.setEnabled(true); controlpad.cancelGameButton.setEnabled(false); chesspad.statusText.setText("请建立游戏或者加入游戏"); } if(!isOnChess) { controlpad.creatGameButton.setEnabled(true); controlpad.joinGameButton.setEnabled(true); controlpad.cancelGameButton.setEnabled(false); chesspad.statusText.setText("请建立游戏或者加入游戏"); } isClient=isServer=false; }
}
public void keyPressed(KeyEvent e) { TextField inputWords=(TextField)e.getSource();
if(e.getKeyCode()==KeyEvent.VK_ENTER) { if(inputpad.userChoice.getSelectedItem().equals("所有人")) { try { out.writeUTF(inputWords.getText()); inputWords.setText(""); } catch(Exception ea) { chatpad.chatLineArea.setText("chessClient:KeyPressed无法连接,建议重新连接 \n"); userpad.userList.removeAll(); inputpad.userChoice.removeAll(); inputWords.setText(""); controlpad.connectButton.setEnabled(true); } } else { try { out.writeUTF("/"+inputpad.userChoice.getSelectedItem()+" "+inputWords.getText()); inputWords.setText(""); } catch(Exception ea) { chatpad.chatLineArea.setText("chessClient:KeyPressed无法连接,建议重新连接 \n"); userpad.userList.removeAll(); inputpad.userChoice.removeAll(); inputWords.setText(""); controlpad.connectButton.setEnabled(true); } } }
}
public void keyTyped(KeyEvent e) { } public void keyReleased(KeyEvent e) { }
public static void main(String args[]) { chessClient chessClient=new chessClient(); } }
/****************************************************************************************** 下面是:chessInteface.java ******************************************************************************************/
import java.awt.*; import java.awt.event.*; import java.io.*; import java.net.*;
class userPad extends Panel { List userList=new List(10);
userPad() { setLayout(new BorderLayout());
for(int i=0;i<50;i++) { userList.add(i+"."+"没有用户"); } add(userList,BorderLayout.CENTER);
}
}
class chatPad extends Panel { TextArea chatLineArea=new TextArea("",18,30,TextArea.SCROLLBARS_VERTICAL_ONLY);
chatPad() { setLayout(new BorderLayout());
add(chatLineArea,BorderLayout.CENTER); }
}
class controlPad extends Panel { Label IPlabel=new Label("IP",Label.LEFT); TextField inputIP=new TextField("localhost",10); Button connectButton=new Button("连接主机"); Button creatGameButton=new Button("建立游戏"); Button joinGameButton=new Button("加入游戏"); Button cancelGameButton=new Button("放弃游戏"); Button exitGameButton=new Button("关闭程序");
controlPad() { setLayout(new FlowLayout(FlowLayout.LEFT)); setBackground(Color.pink);
add(IPlabel); add(inputIP); add(connectButton); add(creatGameButton); add(joinGameButton); add(cancelGameButton); add(exitGameButton); }
}
class inputPad extends Panel { TextField inputWords=new TextField("",40); Choice userChoice=new Choice();
inputPad() { setLayout(new FlowLayout(FlowLayout.LEFT)); for(int i=0;i<50;i++) { userChoice.addItem(i+"."+"没有用户"); } userChoice.setSize(60,24); add(userChoice); add(inputWords); } }
/********************************************************************************************** 下面是:chessPad.java **********************************************************************************************/ import java.awt.*; import java.awt.event.*; import java.io.*; import java.net.*; import java.util.*;
class chessThread extends Thread { chessPad chesspad;
chessThread(chessPad chesspad) { this.chesspad=chesspad; }
public void sendMessage(String sndMessage) { try { chesspad.outData.writeUTF(sndMessage); } catch(Exception ea) { System.out.println("chessThread.sendMessage:"+ea); } }
public void acceptMessage(String recMessage) { if(recMessage.startsWith("/chess ")) { StringTokenizer userToken=new StringTokenizer(recMessage," "); String chessToken; String[] chessOpt={"-1","-1","0"}; int chessOptNum=0;
while(userToken.hasMoreTokens()) { chessToken=(String)userToken.nextToken(" "); if(chessOptNum>=1 && chessOptNum<=3) { chessOpt[chessOptNum-1]=chessToken;
} chessOptNum++; } chesspad.netChessPaint(Integer.parseInt(chessOpt[0]),Integer.parseInt(chessOpt[1]),Integer.parseInt(chessOpt[2]));
} else if(recMessage.startsWith("/yourname ")) { chesspad.chessSelfName=recMessage.substring(10); } else if(recMessage.equals("/error")) { chesspad.statusText.setText("错误:没有这个用户,请退出程序,重新加入"); } else { //System.out.println(recMessage); } }
public void run() { String message=""; try { while(true) { message=chesspad.inData.readUTF(); acceptMessage(message); } } catch(IOException es) { } }
}
class chessPad extends Panel implements MouseListener,ActionListener { int chessPoint_x=-1,chessPoint_y=-1,chessColor=1; int chessBlack_x[]=new int[200]; int chessBlack_y[]=new int[200]; int chessWhite_x[]=new int[200]; int chessWhite_y[]=new int[200]; int chessBlackCount=0,chessWhiteCount=0; int chessBlackWin=0,chessWhiteWin=0; boolean isMouseEnabled=false,isWin=false,isInGame=false; TextField statusText=new TextField("请先连接服务器");
Socket chessSocket; DataInputStream inData; DataOutputStream outData;
String chessSelfName=null; String chessPeerName=null; String host=null; int port=4331; chessThread chessthread=new chessThread(this);
chessPad() { setSize(440,440); setLayout(null); setBackground(Color.pink); addMouseListener(this); add(statusText); statusText.setBounds(40,5,360,24); statusText.setEditable(false); }
public boolean connectServer(String ServerIP,int ServerPort) throws Exception { try { chessSocket=new Socket(ServerIP,ServerPort); inData=new DataInputStream(chessSocket.getInputStream()); outData=new DataOutputStream(chessSocket.getOutputStream()); chessthread.start(); return true; } catch(IOException ex) { statusText.setText("chessPad:connectServer:无法连接 \n"); } return false; }
public void chessVictory(int chessColorWin) { this.removeAll(); for(int i=0;i<=chessBlackCount;i++) { chessBlack_x[i]=0; chessBlack_y[i]=0; } for(int i=0;i<=chessWhiteCount;i++) { chessWhite_x[i]=0; chessWhite_y[i]=0; } chessBlackCount=0; chessWhiteCount=0; add(statusText); statusText.setBounds(40,5,360,24);
if(chessColorWin==1) { chessBlackWin++; statusText.setText("黑棋胜,黑:白为"+chessBlackWin+":"+chessWhiteWin+",重新开局,等待白棋下子..."); } else if(chessColorWin==-1) { chessWhiteWin++; statusText.setText("白棋胜,黑:白为"+chessBlackWin+":"+chessWhiteWin+",重新开局,等待黑棋下子..."); } }
public void getLocation(int a,int b,int color) {
if(color==1) { chessBlack_x[chessBlackCount]=a*20; chessBlack_y[chessBlackCount]=b*20; chessBlackCount++; } else if(color==-1) { chessWhite_x[chessWhiteCount]=a*20; chessWhite_y[chessWhiteCount]=b*20; chessWhiteCount++; } }
public boolean checkWin(int a,int b,int checkColor) { int step=1,chessLink=1,chessLinkTest=1,chessCompare=0; if(checkColor==1) { chessLink=1; for(step=1;step<=4;step++) { for(chessCompare=0;chessCompare<=chessBlackCount;chessCompare++) { if(((a+step)*20==chessBlack_x[chessCompare]) && ((b*20)==chessBlack_y[chessCompare])) { chessLink=chessLink+1; if(chessLink==5) { return(true); } } } if(chessLink==(chessLinkTest+1)) chessLinkTest++; else break; } for(step=1;step<=4;step++) { for(chessCompare=0;chessCompare<=chessBlackCount;chessCompare++) { if(((a-step)*20==chessBlack_x[chessCompare]) && (b*20==chessBlack_y[chessCompare])) { chessLink++; if(chessLink==5) { return(true); } } } if(chessLink==(chessLinkTest+1)) chessLinkTest++; else break; } chessLink=1; chessLinkTest=1; for(step=1;step<=4;step++) { for(chessCompare=0;chessCompare<=chessBlackCount;chessCompare++) { if((a*20==chessBlack_x[chessCompare]) && ((b+step)*20==chessBlack_y[chessCompare])) { chessLink++; if(chessLink==5) { return(true); } } } if(chessLink==(chessLinkTest+1)) chessLinkTest++; else break; } for(step=1;step<=4;step++) { for(chessCompare=0;chessCompare<=chessBlackCount;chessCompare++) { if((a*20==chessBlack_x[chessCompare]) && ((b-step)*20==chessBlack_y[chessCompare])) { chessLink++; if(chessLink==5) { return(true); } } } if(chessLink==(chessLinkTest+1)) chessLinkTest++; else break; } chessLink=1; chessLinkTest=1; for(step=1;step<=4;step++) { for(chessCompare=0;chessCompare<=chessBlackCount;chessCompare++) { if(((a-step)*20==chessBlack_x[chessCompare]) && ((b+step)*20==chessBlack_y[chessCompare])) { chessLink++; if(chessLink==5) { return(true); } } } if(chessLink==(chessLinkTest+1)) chessLinkTest++; else break; } for(step=1;step<=4;step++) { for(chessCompare=0;chessCompare<=chessBlackCount;chessCompare++) { if(((a+step)*20==chessBlack_x[chessCompare]) && ((b-step)*20==chessBlack_y[chessCompare])) { chessLink++; if(chessLink==5) { return(true); } } } if(chessLink==(chessLinkTest+1)) chessLinkTest++; else break; } chessLink=1; chessLinkTest=1; for(step=1;step<=4;step++) { for(chessCompare=0;chessCompare<=chessBlackCount;chessCompare++) { if(((a+step)*20==chessBlack_x[chessCompare]) && ((b+step)*20==chessBlack_y[chessCompare])) { chessLink++; if(chessLink==5) { return(true); } } } if(chessLink==(chessLinkTest+1)) chessLinkTest++; else break; } for(step=1;step<=4;step++) { for(chessCompare=0;chessCompare<=chessBlackCount;chessCompare++) { if(((a-step)*20==chessBlack_x[chessCompare]) && ((b-step)*20==chessBlack_y[chessCompare])) { chessLink++; if(chessLink==5) { return(true); } } } if(chessLink==(chessLinkTest+1)) chessLinkTest++; else break; } } else if(checkColor==-1) { chessLink=1; for(step=1;step<=4;step++) { for(chessCompare=0;chessCompare<=chessWhiteCount;chessCompare++) { if(((a+step)*20==chessWhite_x[chessCompare]) && (b*20==chessWhite_y[chessCompare])) { chessLink++; if(chessLink==5) { return(true); } } } if(chessLink==(chessLinkTest+1)) chessLinkTest++; else break; } for(step=1;step<=4;step++) { for(chessCompare=0;chessCompare<=chessWhiteCount;chessCompare++) { if(((a-step)*20==chessWhite_x[chessCompare]) && (b*20==chessWhite_y[chessCompare])) { chessLink++; if(chessLink==5) { return(true); } } } if(chessLink==(chessLinkTest+1)) chessLinkTest++; else break; } chessLink=1; chessLinkTest=1; for(step=1;step<=4;step++) { for(chessCompare=0;chessCompare<=chessWhiteCount;chessCompare++) { if((a*20==chessWhite_x[chessCompare]) && ((b+step)*20==chessWhite_y[chessCompare])) { chessLink++; if(chessLink==5) { return(true); } } } if(chessLink==(chessLinkTest+1)) chessLinkTest++; else break; } for(step=1;step<=4;step++) { for(chessCompare=0;chessCompare<=chessWhiteCount;chessCompare++) { if((a*20==chessWhite_x[chessCompare]) && ((b-step)*20==chessWhite_y[chessCompare])) { chessLink++; if(chessLink==5) { return(true); } } } if(chessLink==(chessLinkTest+1)) chessLinkTest++; else break; } chessLink=1; chessLinkTest=1; for(step=1;step<=4;step++) { for(chessCompare=0;chessCompare<=chessWhiteCount;chessCompare++) { if(((a-step)*20==chessWhite_x[chessCompare]) && ((b+step)*20==chessWhite_y[chessCompare])) { chessLink++; if(chessLink==5) { return(true); } } } if(chessLink==(chessLinkTest+1)) chessLinkTest++; else break; } for(step=1;step<=4;step++) { for(chessCompare=0;chessCompare<=chessWhiteCount;chessCompare++) { if(((a+step)*20==chessWhite_x[chessCompare]) && ((b-step)*20==chessWhite_y[chessCompare])) { chessLink++; if(chessLink==5) { return(true); } } } if(chessLink==(chessLinkTest+1)) chessLinkTest++; else break; } chessLink=1; chessLinkTest=1; for(step=1;step<=4;step++) { for(chessCompare=0;chessCompare<=chessWhiteCount;chessCompare++) { if(((a+step)*20==chessWhite_x[chessCompare]) && ((b+step)*20==chessWhite_y[chessCompare])) { chessLink++; if(chessLink==5) { return(true); } } } if(chessLink==(chessLinkTest+1)) chessLinkTest++; else break; } for(step=1;step<=4;step++) { for(chessCompare=0;chessCompare<=chessWhiteCount;chessCompare++) { if(((a-step)*20==chessWhite_x[chessCompare]) && ((b-step)*20==chessWhite_y[chessCompare])) { chessLink++; if(chessLink==5) { return(true); } } } if(chessLink==(chessLinkTest+1)) chessLinkTest++; else break; } } return(false); }
public void paint(Graphics g) { for (int i=40;i<=380;i=i+20) { g.drawLine(40,i,400,i); } g.drawLine(40,400,400,400); for(int j=40;j<=380;j=j+20) { g.drawLine(j,40,j,400); } g.drawLine(400,40,400,400); g.fillOval(97,97,6,6); g.fillOval(337,97,6,6); g.fillOval(97,337,6,6); g.fillOval(337,337,6,6); g.fillOval(217,217,6,6); }
public void chessPaint(int chessPoint_a,int chessPoint_b,int color) { chessPoint_black chesspoint_black=new chessPoint_black(this); chessPoint_white chesspoint_white=new chessPoint_white(this);
if(color==1 && isMouseEnabled) { getLocation(chessPoint_a,chessPoint_b,color); isWin=checkWin(chessPoint_a,chessPoint_b,color); if(isWin==false) { chessthread.sendMessage("/"+chessPeerName+" /chess "+chessPoint_a+" "+chessPoint_b+" "+color); this.add(chesspoint_black); chesspoint_black.setBounds(chessPoint_a*20-7,chessPoint_b*20-7,16,16); statusText.setText("黑(第"+chessBlackCount+"步)"+chessPoint_a+" "+chessPoint_b+",请白棋下子"); isMouseEnabled=false; } else { chessthread.sendMessage("/"+chessPeerName+" /chess "+chessPoint_a+" "+chessPoint_b+" "+color); this.add(chesspoint_black); chesspoint_black.setBounds(chessPoint_a*20-7,chessPoint_b*20-7,16,16); chessVictory(1); isMouseEnabled=false; } } else if(color==-1 && isMouseEnabled) { getLocation(chessPoint_a,chessPoint_b,color); isWin=checkWin(chessPoint_a,chessPoint_b,color); if(isWin==false) { chessthread.sendMessage("/"+chessPeerName+" /chess "+chessPoint_a+" "+chessPoint_b+" "+color); this.add(chesspoint_white); chesspoint_white.setBounds(chessPoint_a*20-7,chessPoint_b*20-7,16,16); statusText.setText("白(第"+chessWhiteCount+"步)"+chessPoint_a+" "+chessPoint_b+",请黑棋下子"); isMouseEnabled=false; } else { chessthread.sendMessage("/"+chessPeerName+" /chess "+chessPoint_a+" "+chessPoint_b+" "+color); this.add(chesspoint_white); chesspoint_white.setBounds(chessPoint_a*20-7,chessPoint_b*20-7,16,16); chessVictory(-1); isMouseEnabled=false; } } }
public void netChessPaint(int chessPoint_a,int chessPoint_b,int color) { chessPoint_black chesspoint_black=new chessPoint_black(this); chessPoint_white chesspoint_white=new chessPoint_white(this); getLocation(chessPoint_a,chessPoint_b,color); if(color==1) { isWin=checkWin(chessPoint_a,chessPoint_b,color); if(isWin==false) {
this.add(chesspoint_black); chesspoint_black.setBounds(chessPoint_a*20-7,chessPoint_b*20-7,16,16); statusText.setText("黑(第"+chessBlackCount+"步)"+chessPoint_a+" "+chessPoint_b+",请白棋下子"); isMouseEnabled=true; } else { this.add(chesspoint_black); chesspoint_black.setBounds(chessPoint_a*20-7,chessPoint_b*20-7,16,16); chessVictory(1); isMouseEnabled=true; } } else if(color==-1) { isWin=checkWin(chessPoint_a,chessPoint_b,color); if(isWin==false) { this.add(chesspoint_white); chesspoint_white.setBounds(chessPoint_a*20-7,chessPoint_b*20-7,16,16); statusText.setText("白(第"+chessWhiteCount+"步)"+chessPoint_a+" "+chessPoint_b+",请黑棋下子"); isMouseEnabled=true; } else { chessthread.sendMessage("/"+chessPeerName+" /victory "+color); this.add(chesspoint_white); chesspoint_white.setBounds(chessPoint_a*20-7,chessPoint_b*20-7,16,16); chessVictory(-1); isMouseEnabled=true; } } }
public void mousePressed(MouseEvent e) { if (e.getModifiers()==InputEvent.BUTTON1_MASK) { chessPoint_x=(int)e.getX(); chessPoint_y=(int)e.getY(); int a=(chessPoint_x+10)/20,b=(chessPoint_y+10)/20; if(chessPoint_x/20<2||chessPoint_y/20<2||chessPoint_x/20>19||chessPoint_y/20>19) {} else { chessPaint(a,b,chessColor); } } }
public void mouseReleased(MouseEvent e){} public void mouseEntered(MouseEvent e) {} public void mouseExited(MouseEvent e) {} public void mouseClicked(MouseEvent e) {}
public void actionPerformed(ActionEvent e) {
} }
class chessPoint_black extends Canvas implements MouseListener { chessPad chesspad=null; chessPoint_black(chessPad p) { setSize(20,20); chesspad=p; addMouseListener(this); }
public void paint(Graphics g) { g.setColor(Color.black); g.fillOval(0,0,14,14); }
public void mousePressed(MouseEvent e) { // if(e.getModifiers()==InputEvent.BUTTON3_MASK) // { // chesspad.remove(this); // chesspad.chessColor=1; // chesspad.text_2.setText(""); // chesspad.text_1.setText("请黑棋下子"); // } } public void mouseReleased(MouseEvent e){} public void mouseEntered(MouseEvent e) {} public void mouseExited(MouseEvent e) {} public void mouseClicked(MouseEvent e) {} }
class chessPoint_white extends Canvas implements MouseListener { chessPad chesspad=null; chessPoint_white(chessPad p) { setSize(20,20); addMouseListener(this); chesspad=p; }
public void paint(Graphics g) { g.setColor(Color.white); g.fillOval(0,0,14,14); }
public void mousePressed(MouseEvent e) { // if(e.getModifiers()==InputEvent.BUTTON3_MASK) // { // chesspad.remove(this); // chesspad.chessColor=-1; // chesspad.text_2.setText("请白旗下子"); // chesspad.text_1.setText(""); // } } public void mouseReleased(MouseEvent e){} public void mouseEntered(MouseEvent e) {} public void mouseExited(MouseEvent e) {} public void mouseClicked(MouseEvent e) { // if(e.getClickCount()>=2) // chesspad.remove(this); } }
/****************************************************************************************** 最后是:chessServer.java *******************************************************************************************/ import java.io.*; import java.net.*; import java.awt.*; import java.util.*; import java.awt.event.*;
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); } }
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;
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(clientNameHash.containsValue(("[inchess]"+(String)clientNameHash.get(clientSocket)))) { synchronized(clientNameHash) { clientNameHash.put((Socket)getHashKey(clientNameHash,("[inchess]"+clientNameHash.get(clientSocket))), ("[inchess]"+clientName)); chessPeerTalk(("[inchess]"+clientName),("/yourname "+("[inchess]"+clientName))); } } 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)); 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()); }
}
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(); } } }
}
public boolean peerTalk(String peerTalk,String talkMessage) {
for(Enumeration enu=clientDataHash.keys();enu.hasMoreElements();) { Socket userClient=(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(talkMessage); } 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 chessTalkMessage) {
for(Enumeration enu=clientDataHash.keys();enu.hasMoreElements();) { Socket userClient=(Socket)enu.nextElement();
if(chessPeerTalk.equals((String)clientNameHash.get(userClient)) && !chessPeerTalk.equals((String)clientNameHash.get(clientSocket))) { synchronized(clientDataHash) { 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) { DataOutputStream outData=(DataOutputStream)clientDataHash.get(clientSocket); try { outData.writeUTF(feedbackString); } catch(Exception eb) { eb.printStackTrace(); } }
}
public String getUserList() { String userList="/userlist";
for(Enumeration enu=clientNameHash.elements();enu.hasMoreElements();) { userList=userList+" "+(String)enu.nextElement(); } return(userList); }
public Object getHashKey(Hashtable targetHash,Object hashValue) { Object hashKey; for(Enumeration enu=targetHash.keys();enu.hasMoreElements();) { hashKey=(Object)enu.nextElement(); if(hashValue.equals((Object)targetHash.get(hashKey))) return(hashKey); } return(null); }
public void firstCome() { publicTalk(getUserList()); Feedback("/yourname "+(String)clientNameHash.get(clientSocket)); Feedback("Java五子棋聊天客户端"); Feedback("/changename <你的名字> --更改名字"); Feedback("/list --更新用户列表"); Feedback("/<用户名> <要说的话> --私聊"); Feedback("注意:用命令的时候,先把谈话的对象定为所有人"); }
public void clientClose() { server.messageBoard.append("用户断开:"+clientSocket+"\n"); //如果是游戏客户端主机 synchronized(chessPeerHash) { if(chessPeerHash.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"); } } synchronized(clientDataHash) { clientDataHash.remove(clientSocket); } synchronized(clientNameHash) { clientNameHash.remove(clientSocket); } publicTalk(getUserList()); server.statusLabel.setText("当前连接数:"+clientDataHash.size()); try { clientSocket.close(); } catch(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(message); } } catch(IOException esx) { } finally { if(!isClientClosed) { clientClose(); } } }
}
public class chessServer extends Frame implements ActionListener {
Button messageClearButton=new Button("清除显示"); Button serverStatusButton=new Button("服务器状态"); Button serverOffButton=new Button("关闭服务器"); Panel buttonPanel=new Panel();
MessageServer server=new MessageServer(); ServerSocket serverSocket; Hashtable clientDataHash=new Hashtable(50); Hashtable clientNameHash=new Hashtable(50); Hashtable chessPeerHash=new Hashtable(50);
chessServer() { super("Java五子棋服务器"); setBackground(Color.pink);
buttonPanel.setLayout(new FlowLayout()); messageClearButton.setSize(60,25); buttonPanel.add(messageClearButton); messageClearButton.addActionListener(this); serverStatusButton.setSize(75,25); buttonPanel.add(serverStatusButton); serverStatusButton.addActionListener(this); serverOffButton.setSize(75,25); buttonPanel.add(serverOffButton); serverOffButton.addActionListener(this);
add(server,BorderLayout.CENTER); add(buttonPanel,BorderLayout.SOUTH);
addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); pack(); setVisible(true); setSize(400,450); setResizable(false); validate(); try { makeMessageServer(4331,server); } catch(Exception e) { System.out.println("e"); } }
public void makeMessageServer(int port,MessageServer server) throws IOException { Socket clientSocket; long clientAccessNumber=1; this.server=server;
try { serverSocket=new ServerSocket(port); server.messageBoard.setText("服务器开始于:"+serverSocket.getInetAddress().getLocalHost()+":"+serverSocket.getLocalPort()+"\n");
while(true) { clientSocket=serverSocket.accept(); server.messageBoard.append("用户连接:"+clientSocket+"\n");
DataOutputStream outData=new DataOutputStream(clientSocket.getOutputStream());
clientDataHash.put(clientSocket,outData); clientNameHash.put(clientSocket,("新来客"+clientAccessNumber++));
ServerThread thread=new ServerThread(clientSocket,clientDataHash,clientNameHash,chessPeerHash,server);
thread.start(); } } catch(IOException ex) { System.out.println("已经有服务器在运行. \n"); }
}
public void actionPerformed(ActionEvent e) { if(e.getSource()==messageClearButton) { server.messageBoard.setText(""); } if(e.getSource()==serverStatusButton) { try { server.messageBoard.append("服务器信息:"+serverSocket.getInetAddress().getLocalHost()+":"+serverSocket.getLocalPort()+"\n"); } catch(Exception ee) { System.out.println("serverSocket.getInetAddress().getLocalHost() error \n"); } } if(e.getSource()==serverOffButton) { System.exit(0); } }
public static void main(String args[]) { chessServer chessServer=new chessServer(); } }

|