📄 tryserver.java
字号:
import java.io.*;
import java.net.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.JButton;
import javax.swing.JToolBar;
public class TryServer
{
public static void main(String args[])
{
TServer app=new TServer();
app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
app.show();
app.runServer(); //开始开始运行服务器
}
}
class TServer extends JFrame
{
JButton button[]=new JButton[9]; //9个按钮,用于接受输入并显示图案
JTextArea textArea; //文本域,用于显示对方传送过来的信息
JButton select1,select2,exit,restart,startgame; //分别用于图案选择与退出铵钮
JToolBar toolbar=new JToolBar("工具栏");
int record[]=new int[9]; //用于记录9个面板按钮的当前状态
JPanel panel=new JPanel();
Icon icon[]=new Icon[2];
Icon image[]=new Icon[2]; //贴图的图标
Icon backcolor=new ImageIcon("bground.gif");
int imageType; //用于记录两张图标应该选择哪一张
ServerSocket server;
Socket connection;
boolean pressed; //判断是否已经按下一次
ObjectOutputStream output;
ObjectInputStream input; //定义输入输出流,用于接收数据
boolean start=true; //判断是否已经开始游戏
int totalnum,servernum,clientnum; //分别记录贴子的总数,自己的数目,对方的数目
public TServer()
{
super("服务器端游戏");
Container cpp=getContentPane();
toolbar=new JToolBar("工具栏"); //创建工具栏
imageType=0;
ActionListener command=new Actionhandler(); //添加事件监听器
cpp.setLayout(new BorderLayout());
textArea=new JTextArea(4,20);
icon[0]=new ImageIcon("circle.gif");
icon[1]=new ImageIcon("line.gif");
select1=new JButton("",icon[0]);
select2=new JButton("",icon[1]);
startgame=new JButton("startGame");
startgame.addActionListener(command);
exit=new JButton(" Exit ");
exit.addActionListener(command);
restart=new JButton("Restart");
restart.addActionListener(command);
image[0]=new ImageIcon("cimage.gif");
image[1]=new ImageIcon("limage.gif"); //装载图标
toolbar.add(select1);
toolbar.addSeparator();
toolbar.add(select2);
toolbar.addSeparator();
toolbar.add(startgame);
toolbar.addSeparator();
toolbar.add(exit);
toolbar.addSeparator();
toolbar.add(restart); //创建工具栏
cpp.add(toolbar,BorderLayout.NORTH);
panel.setSize(200,200);
panel.setLayout(new GridLayout(3,3)); //在框架中另外创建一个面板类
int i=0;
for( i=0;i<9;i++)
{
button[i]=new JButton(""); //创建桌面上按钮
button[i].setBackground(new Color(125,0,10));
button[i].addActionListener(command);
panel.add(button[i]); //把按钮添加到面板中
}
for(i=0;i<9;i++)
record[i]=-1; //初始化记录数组
cpp.add(panel,BorderLayout.CENTER);
cpp.add(new JScrollPane(textArea),BorderLayout.SOUTH); //安排桌面的布局
setSize(400,400);
setVisible(true);
}
public void runServer()
{
//设置服务器,接受客户端的连接
try
{
//创建一个服务器的端口
server = new ServerSocket( 5000, 100 );
while ( true )
{
waitForConnection(); //等待连接
getStreams(); //接受消息
processConnection(); //处理连接
closeConnection(); //关闭连接
}
}
catch ( EOFException eofException )
{
System.out.println( "Client terminated connection" );
}
//输入输出处理方法
catch ( IOException ioException )
{
ioException.printStackTrace();
}
}//end_runServer()
private void getStreams() throws IOException
{
//设置输出流
output = new ObjectOutputStream(
connection.getOutputStream() );
output.flush();
//设置输入流
input = new ObjectInputStream(
connection.getInputStream() );
textArea.append( "\nGot I/O streams\n" );
}
private void closeConnection() throws IOException
{
textArea.append( "\nUser terminated connection" );
output.close();
input.close();
connection.close();
}
private void waitForConnection() throws IOException
{
textArea.setText( "Waiting for connection\n" );
//允许服务器接受连接
connection = server.accept();
textArea.append( "Connection received from: " +
connection.getInetAddress().getHostName() );
}//end_waitForConnection()
private void processConnection() throws IOException
{
//发送成功连接的信号
String message = "SERVER>>> Connection successful";
output.writeObject( message );
output.flush();
//处理客户端发送过来的消息
do {
//接受消息并处理消息
try
{
message = ( String ) input.readObject();
if(message.substring(0,5).equals("start")) //对方发出开始的命令
{
start=false;
if(message.charAt(11)=='0') imageType=1;
else imageType=0; //选择贴图的图标
}
else if(message.substring(0,5).equals("order")) //对方贴子的操作
{
int i=0;
i=Integer.parseInt(message.substring(6,7));
if(imageType==0)
{
record[i]=1; //对方的子
button[i].setIcon(image[1]);
clientnum++;
totalnum++;
}
else
{
record[i]=0;
button[i].setIcon(image[0]);
clientnum++;
totalnum++;
}
pressed=true;
if(IsGameOver()) //胜负已经揭晓
{
start=true;
startAgain();
pressed=true;
}
else if(totalnum==9)
{
JOptionPane.showMessageDialog(null,"双方不分胜负,此局结束,请重新开始");
start=true;
startAgain();
pressed=true;
}
}
else if(message.substring(0,7).equals("restart"))
{
start=false;
startAgain(); //重新开始
}
textArea.append( "\n" + message );
textArea.setCaretPosition(
textArea.getText().length() );
}
//异常处理函数
catch ( ClassNotFoundException classNotFoundException )
{
textArea.append( "\nUnknown object type received" );
}
} while ( !message.equals( "game over" ) );
}//end_processConnection()
//重新开始游戏,并重新做初始化工作
public void startAgain()
{
int i;
for(i=0;i<9;i++)
{
button[i].setIcon(backcolor);
record[i]=-1;
}
totalnum=0;
servernum=0;
clientnum=0;
if(start)
sendData("restart");
}
//判断游戏是否结束的方法
public boolean IsGameOver()
{
if(record[4]==0) //以4为中心,总共有4种取胜的可能
{
if((record[3]==0&&record[5]==0)||(record[1]==0&&record[7]==0)||(record[0]==0&&record[8]==0)||(record[2]==0&&record[6]==0))
{ if(imageType==1)
JOptionPane.showMessageDialog(null,"客户端已经获胜,游戏结束,按restart可以重新开始游戏");
else
JOptionPane.showMessageDialog(null,"服务器端已经获胜,游戏结束,按restart可以重新开始游戏");
return true;
}
}
else if(record[4]==1)
{
if((record[3]==1&&record[5]==1)||(record[1]==1&&record[7]==1)||(record[0]==1&&record[8]==1)||(record[2]==1&&record[6]==1))
{ if(imageType==0)
JOptionPane.showMessageDialog(null,"客户端已经获胜,游戏结束,按restart可以重新开始游戏");
else
JOptionPane.showMessageDialog(null,"服务器端已经获胜,游戏结束,按restart可以重新开始游戏");
return true;
}
}
//判断四周是否存在获胜组合,共有4种
if((record[0]==0&&record[1]==0&&record[2]==0)||(record[0]==0&&record[3]==0&&record[6]==0)
||(record[6]==0&&record[7]==0&&record[8]==0)||(record[2]==0&&record[5]==0&&record[8]==0))
{
if(imageType==1)
JOptionPane.showMessageDialog(null,"客户端已经获胜,游戏结束,按restart可以重新开始游戏");
else
JOptionPane.showMessageDialog(null,"服务器端已经获胜,游戏结束,按restart可以重新开始游戏");
return true;
}
if((record[0]==1&&record[1]==1&&record[2]==1)||(record[0]==1&&record[3]==1&&record[6]==1)
||(record[6]==1&&record[7]==1&&record[8]==1)||(record[2]==1&&record[5]==1&&record[8]==1))
{
if(imageType==0)
JOptionPane.showMessageDialog(null,"客户端已经获胜,游戏结束,按restart可以重新开始游戏");
else
JOptionPane.showMessageDialog(null,"服务器端已经获胜,游戏结束,按restart可以重新开始游戏");
return true;
}
return false; //还不分胜负
}//end_IsGameOver()
public void sendData(String command)
{
//发送消息到客户端
try {
output.writeObject( command );
output.flush();
textArea.append("\nCLIENT>>>" + command );
}
//处理消息发送的异常
catch ( IOException ioException )
{
textArea.append( "\nError writing object" );
}
}//end_sendData()
//事件监听类
public class Actionhandler implements ActionListener
{
public void actionPerformed(ActionEvent e)
{
if(e.getSource().equals(startgame))
{
if(start) //如果对方还没按下开始键
StartGame();
else JOptionPane.showMessageDialog(null,"对方已经按下开始键下");
}
else if(e.getSource().equals(exit))
{
sendData("game over");
System.exit(0);
}
else if(e.getSource().equals(restart))
{
if(start)
restart(); //调动重新开始方法
else
JOptionPane.showMessageDialog(null,"对方已经按下开始键了");
}
else //下面处理面板上的按钮的点击事件
{ int i;
for(i=0;!(e.getSource().equals(button[i]))&&i<9;i++); //判断是哪一个按钮被按下的
PressHandler(i);
}
}
//开始游戏处理方法
public void StartGame()
{
int m;
m=(int)(Math.random()*10); //随机分配这一方用的是圈还是勾
if(m%2==0) {
imageType=0;
textArea.append("服务器端选择--圆圈\n");
}
else { imageType=1; //随机选择
textArea.append("服务器端选择--叉\n");
}
sendData("start game:"+imageType+" ");
pressed=true;
}
//游戏重新开始处理方法
public void restart()
{
int i;
for(i=0;i<9;i++)
{
button[i].setIcon(backcolor);
record[i]=-1;
}
sendData("restart");
pressed=true;
}
//在按钮上按键处理的方法
public void PressHandler(int loc)
{
if(pressed)
{
if(record[loc]==-1) //如果这个位置原本是空的
{
button[loc].setIcon(image[imageType]); //给这个位置设置图标
record[loc]=imageType;
sendData("order:"+loc+" ");
textArea.append("\nServer>>>order:"+loc);
totalnum++;
pressed=false;
if(IsGameOver())
{
start=true;
startAgain();
}
else if(totalnum==9)
{
JOptionPane.showMessageDialog(null,"双方不分胜负,本局结束,请重新开始");
start=true;
startAgain();
}
}
else JOptionPane.showMessageDialog(null,"此处不能下");
}
else JOptionPane.showMessageDialog(null,"你已经下过一次了,等对方下完");
}//end_PressHandler()
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -