g.drawLine(30,j*30,15*30,j*30);
j++;
}
}
publicintgetState(intx,inty){
if(x>0&y>0&x<16&y<16)returnboard[x][y];
elsereturn-2;
}
publicvoidsetState(intx,inty,intstate){
board[x][y]=state;
}
}
packageFiveChess;
importjava.awt.BorderLayout;
importjava.awt.Color;
importjava.awt.Dimension;
importjava.awt.Image;
importjava.awt.TextArea;
importjava.awt.Toolkit;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjava.awt.event.KeyListener;
importjava.awt.event.WindowAdapter;
importjava.awt.event.WindowEvent;
importjava.io.IOException;
import.ServerSocket;
import.Socket;
importjava.sql.Time;
importjavax.swing.ImageIcon;
importjavax.swing.JButton;
importjavax.swing.JFrame;
importjavax.swing.JLabel;
importjavax.swing.JMenu;
importjavax.swing.JMenuBar;
importjavax.swing.JMenuItem;
importjavax.swing.JOptionPane;
importjavax.swing.JPanel;
importjavax.swing.JSplitPane;
importjavax.swing.JTextField;
importjavax.swing.border.Border;
publicclassChessServerextendsJFrameimplementsActionListener{
publicstaticfinalintframe_width=35;//窗体的宽度
publicstaticfinalintframe_height=27;//窗体的高度
publicstaticfinalintframe_opration=10;//操作区域的宽度
publicstaticfinalintblock_width=20;//单位宽度
publicstaticfinalintblock_height=20;//单位高度
ServerWarjpz=newServerWar(this);//创建服务器端主面板
JMenuBarmenubar=newJMenuBar();//创建菜单条
JMenufileMenu=newJMenu("文件");
JMenuItemone=newJMenuItem("单人游戏");
JMenuItemtwo=newJMenuItem("双人游戏");
JMenuItemexit=newJMenuItem("退出");
JPaneljpy=newJPanel();//创建操作区的面板
JLabeljlPort=newJLabel("端口号");//创建提示用户输入端口号的标签
JTextFieldjtfPort=newJTextField("9999");//创建用于输入端口号的文本框,默认是9999
JLabeljlNickName=newJLabel("昵称");//创建用于提示输入昵称的标签
JTextFieldjtfNickName=newJTextField("Player2");//创建用于输入昵称的文本框
JButtonjbNew=newJButton("建主");//创建"建主","停止","开始"三个动作按钮
JButtonjbStop=newJButton("停止");
JButtonjbStart=newJButton("开始");
JButtonjbSend=newJButton("发送");
TextAreajaChat=newTextArea("",5000,1,TextArea.SCROLLBARS_VERTICAL_ONLY);
inttextIndex=0;
JTextFieldjtfMessage=newJTextField("你好");
JSplitPanejsp=newJSplitPane(JSplitPane.HORIZONTAL_SPLIT,jpz,jpy);//创建JSplitPane
ServerSocketss;//声明ServerSocket引用
ServerThreadst;//声明服务器线程
ServerAgentThreadsat;//声明服务器代理线程引用
publicChessServer(){
this.addComponent();//初始化窗体,将控件添加到窗体中
this.addListener();//为相应控件注册监听器
this.initialFrame();//初始化窗体
jpz.setFocusable(true);
jpz.requestFocus(true);//使左边面板获得焦点
}
publicvoidaddComponent(){//添加控件的方法
jpy.setLayout(null);//设为空布局
jlPort.setBounds(10,20,40,25);
jpy.add(jlPort);//添加"端口号"标签
jtfPort.setBounds(55,20,100,25);
jpy.add(jtfPort);//添加输入端口号的文本框
jlNickName.setBounds(10,50,40,25);
jpy.add(jlNickName);//添加"昵称"标签
jtfNickName.setBounds(55,50,100,25);
jpy.add(jtfNickName);//添加输入昵称的文本框
jbNew.setBounds(20,85,60,20);
jpy.add(jbNew);//添加"建主"按钮
jbStop.setBounds(100,85,60,20);
jpy.add(jbStop);//添加"停止"按钮
jbStart.setBounds(20,120,140,30);
jpy.add(jbStart);//添加"开始"按钮
jaChat.setBounds(10,230,160,205);
jaChat.setForeground(Color.blue);
jaChat.setEditable(false);
jpy.add(jaChat);
jtfMessage.setBounds(10,440,100,25);
jpy.add(jtfMessage);
jbSend.setBounds(120,440,60,20);
jpy.add(jbSend);
jsp.setDividerLocation((frame_width-frame_opration)*block_width);
jsp.setDividerSize(4);//设置JSplitPane分割线的位置及宽度
fileMenu.add(one);
fileMenu.add(two);
fileMenu.addSeparator();
fileMenu.add(exit);
fileMenu.setBounds(0,0,20,20);
menubar.add(fileMenu);
this.add(menubar,BorderLayout.NORTH);
this.add(jsp);//添加jsp
}
publicvoidaddListener(){//为控件注册监听器
jbNew.addActionListener(this);//为"建主"按钮注册监听器
jbStop.addActionListener(this);//为"停止"按钮注册监听器
jbStart.addActionListener(this);//为"开始"按钮注册监听器
one.addActionListener(this);
two.addActionListener(this);
exit.addActionListener(this);
jbSend.addActionListener(this);
}
publicvoidactionPerformed(ActionEvente){
if(e.getSource()==this.jbNew){//当按下"建主"按钮时
intport=0;
try{//获得用户输入的端口号
port=Integer.parseInt(this.jtfPort.getText().trim());
}
catch(Exceptionee){//如果不是数字则给出提示
JOptionPane.showMessageDialog(this,"端口号只能是整数","错误",
JOptionPane.ERROR_MESSAGE);
return;
}
if(port>65535||port<0){//判断端口号是否在有效范围内
JOptionPane.showMessageDialog(this,"端口号只能是0-65535的整数",
"错误",JOptionPane.ERROR_MESSAGE);
return;
}
try{
ss=newServerSocket(port);//创建ServerSocket
st=newServerThread(this,ss);//创建服务器线程
st.start();//启动服务器线程
JOptionPane.showMessageDialog(this,"服务器启动成功","提示",
JOptionPane.INFORMATION_MESSAGE);//给出成功的提示
this.setState(false);//设置窗体状态
this.jbStart.setEnabled(false);
}
catch(Exceptionee){//启动失败
JOptionPane.showMessageDialog(this,"服务器启动失败","提示",
JOptionPane.INFORMATION_MESSAGE);
}
}
elseif(e.getSource()==this.jbStop){//当单击"停止"按钮时
try{
if(sat!
=null){//代理线程不为空,则向客户端发出离开的消息
sat.dout.writeUTF("<#ServerDown#>");
sat.setFlag(false);//终止代理线程
}
st.setFlag(false);//终止服务器线程
ss.close();//关闭连接
}
catch(IOExceptionee){ee.printStackTrace();}
this.setState(true);//设置窗体状态
jpz.setGameState(false);//设置游戏状态
}
elseif(e.getSource()==this.jbStart){//当单击"开始"按钮时
if(jpz.ready==false){
JOptionPane.showMessageDialog(this,"客户端还未准备",
"提示",JOptionPane.INFORMATION_MESSAGE);
}else{
intresult=JOptionPane.showConfirmDialog(this,"是否开始新游戏?
",
"提示",JOptionPane.YES_NO_OPTION);
if(result==0){
try{sat.dout.writeUTF("<#Start#>");}
catch(IOExceptionee){ee.printStackTrace();}
jpz.setGameState(true);//开始游戏
jpz.setChess_id(0);
jpz.chess=newChess[255];
jpz.chess[0]=newChess(0,0,0,0);
jpz.repaint();
}
}
}
elseif(e.getSource()==this.one){
//与计算机游戏
jtfPort.setEnabled(false);
jtfNickName.setEnabled(false);
jbNew.setEnabled(false);
jbStop.setEnabled(false);
jbStart.setEnabled(false);
jpz.setGameState(false);
jpz.setOneGameState(true);
}
elseif(e.getSource()==this.two){
setState(true);
jpz.setOneGameState(false);
}
elseif(e.getSource()==this.exit){
intresult=JOptionPane.showConfirmDialog(this,"是否要退出?
",
"提示",JOptionPane.YES_NO_OPTION);
if(result==0){
System.exit(0);
}
}
elseif(e.getSource()==this.jbSend){
if(!
jtfMessage.getText().trim().equals("")){
Timetime=newTime(System.currentTimeMillis());
Stringmessage=jtfNickName.getText()+""+time.getHours()+":
"+time.getMinutes()+":
"+time.getSeconds()+"\n"+jtfMessage.getText()+"\n";
try{
sat.dout.writeUTF("<#ServerMessage#>"+message);
}catch(IOExceptione1){
e1.printStackTrace();
}
jtfMessage.setText("");
jaChat.insert(message,textIndex);
textIndex+=message.length();
}else{
Strings="不能发送空消息。
\n";
jaChat.insert(s,textIndex);
textIndex+=s.length();
}
}
jpz.requestFocus(true);
}
publicvoidinitialFrame(){//初始化窗体的方法
this.setState(true);
//Imageimage=newImageIcon("ico.gif").getImage();
//this.setIconImage(image);//设置图标
this.setTitle("FiveChess--Server");//设置标题
this.setResizable(false);
DimensionscreenSize=//获得屏幕尺寸
Toolkit.getDefaultToolkit().getScreenSize();
intcenterX=screenSize.width/2;//计算屏幕的中心坐标
intcenterY=screenSize.height/2;
intwidth=frame_width*block_width;//计算窗口的高度和宽度
intheight=frame_height*block_height;
this.setBounds(centerX-width/2,centerY-height/2-30,width,height);//使窗体居中显示
this.addWindowListener(
newWindowAdapter(){
publicvoidwindowClosing(WindowEvente){
if(st==null){//服务器线程为空,则直接退出
System.exit(0);
return;
}
try{
if(sat!
=null){//代理线程非空,向客户端发送离开的消息
sat.dout.writeUTF("<#ServerDown#>");
sat.setFlag(false);//终止代理线程
}
st.setFlag(false);//终止服务器线程
ss.close();//关闭连接
}
catch(IOExceptionee){ee.printStackTrace();}
System.exit(0);
}