jotaro07 2021-01-08 21:16 采纳率: 0%
浏览 29

Java网络编程写游戏出了问题,求大佬救救孩子

蒟蒻接触Java半年,这几天想写个用TCPsocket写个联网的石头剪刀布,但是发现老是出现“启动服务器失败”,有大佬可以帮我看看什么问题吗(我是在eclipse写的)

package socketgame;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.net.ServerSocket;

public class game {
	public static void main(String[] args) {
	       Play play=new Play("player1");
	       Play play2=new Play("player2");
	}
}

class Table extends JPanel implements Runnable, ActionListener {
	Player self,competitor;
	PlayerPanel playerPanel1, playerPanel2;
	JButton connection,play;
	Socket socket=null;
	DataInputStream in=null;
	DataOutputStream out=null;
	Thread thread;
	boolean isConnect;
	int answer,result;
	Table (){
		setBounds(5,5,400,400);
		setBackground(Color.blue);
		setLayout(null);
		setVisible(true);
		isConnect=false;
		connection=new JButton("连接服务器");
		connection.setSize(100,40);
		connection.setLocation(172,400);
		connection.addActionListener(this);
		connection.setEnabled(true);
		play=new JButton("开始");
		play.setSize(150,40);
		play.setLocation(150,170);
		play.addActionListener(this);
		play.setEnabled(false);		
		self =new Player("我");
		competitor =new Player("对手");
		self.setPlayI(new ImageIcon("D:\\FFOutput\\我的头像.jpg"));
		competitor.setPlayI(new ImageIcon("D\\FFOutput\\对手头像.jpg"));
		playerPanel1 = new PlayerPanel(self);
		playerPanel2 = new PlayerPanel(competitor);
		playerPanel1.setLocation(160,315);
		playerPanel2.setLocation(160,10);
		add(playerPanel1);
		add(playerPanel2);
		add(connection);
		add(play);
		validate();
	}
	public boolean doConnect(){
		try {
			socket=new Socket();
			InetAddress address=InetAddress.getByName("127.0.0.1");
			InetSocketAddress socketAddress=new InetSocketAddress(address,8888);
			socket.connect(socketAddress);  //建立连接
			in=new DataInputStream(socket.getInputStream());
			out=new DataOutputStream(socket.getOutputStream());
			return true;
			} catch (UnknownHostException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
		return false;
	}
	public void sendAnswer(int answer) {
		try {
			out.writeInt(answer);
			this.answer=answer;
		}catch (UnknownHostException e) {
			e.printStackTrace();
		}catch (IOException e) {
			e.printStackTrace();
		}
	}
	public Boolean isServerClose(Socket socket){
		try{
			socket.sendUrgentData(0xFF);//发送1个字节的紧急数据,默认情况下,服务器端没有开启紧急数据处理,不影响正常通信
			return false;
		}catch(Exception se){
			return true;
		}
	}
	public void actionPerformed(ActionEvent e){
		if(e.getSource()==connection){
			if (!isServerClose(socket)) {
				try {
					socket.close();
					System.out.println("正在断开连接"+socket.isClosed());
					isConnect=false;
					play.setEnabled(false);
					playerPanel1.reloadAnswerI(0);
				}catch (IOException ioException) {
					ioException.printStackTrace();
				}
				connection.setText("连接服务器");
			}
			else {
				if (doConnect()){
					thread = new Thread(this);
					thread.start();
					System.out.println("已连接服务器");
					connection.setText("断开服务器");
					play.setEnabled(true);
					play.setText("开始");
					isConnect=true;
				}
			}
		}
		if(e.getSource()==play){
			play.setEnabled(false);
			play.setText("请出拳");
		}
	}
	public void run() {
		System.out.println("启动监听线程");
		while (true) {
			try {
				result = in.readInt();  //堵塞状态,除非读取到信息
				switch (result){
            case 2:playerPanel2.reloadAnswerI(((answer+1)%3+1));play.setText("输了,再来一局");play.setEnabled(true);break;//拿0分为失败
            case 1:playerPanel2.reloadAnswerI(answer);play.setText("打平,再来一局");play.setEnabled(true);break;//拿一分为相同
            case 0:playerPanel2.reloadAnswerI(((answer)%3+1));play.setText("赢了,再来一局");play.setEnabled(true);//拿2分为胜利
            }
				System.out.println("收到服务端应答:" + result);
			} catch (IOException e) {
				break;
			}
		}
	}
}

class AnswerPanel extends JPanel {

    JButton stone,scissors,cloth;
    String imageName[]={"D:\\FFOutput\\石头.jpg","D:\\FFOutput\\剪刀.jpg","D:\\FFOutput\\布.jpg"};
    Icon icon[]= new Icon[imageName.length];
    Box box;
    AnswerPanel(){
        setSize(60,300);
        setVisible(true);
        for (int i=0;i<icon.length;i++){
            icon[i]=new ImageIcon(imageName[i]);
        }
        stone = new JButton(icon[0]);
        stone.setSize(50,50);
        scissors = new JButton(icon[1]);
        scissors.setSize(50,50);
        cloth = new JButton(icon[2]);
        cloth.setSize(50,50);
        box=Box.createVerticalBox();
        box.add(stone);
        box.add(scissors);
        box.add(cloth);
        add(box);
        validate();
    }
}

class Play extends JPanel implements ActionListener {
	Table table;
	AnswerPanel answerPanel;
	JFrame jFrame;
	Play(String userName){
		table = new Table();
		answerPanel=new AnswerPanel();
		jFrame= new JFrame(userName);
		jFrame.setTitle(userName);
		answerPanel.stone.addActionListener(this);
		answerPanel.scissors.addActionListener(this);
		answerPanel.cloth.addActionListener(this);
		jFrame.setBounds(100,100,500,500);
		jFrame.add(table,BorderLayout.CENTER);
		jFrame.add(answerPanel,BorderLayout.EAST);
		jFrame.setVisible(true);
		jFrame.validate();
		jFrame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
}
	public void actionPerformed(ActionEvent e) {
		if(e.getSource()==answerPanel.stone) {
			if (table.isConnect==true&&(table.play.getText()=="请出拳")){		
				System.out.println("石头");			
				table.sendAnswer(1);        
				table.playerPanel1.reloadAnswerI(1);        
				table.play.setText("等待对方");
			}
		}
		else if(e.getSource()==answerPanel.scissors) {
			if (table.isConnect==true&&(table.play.getText()=="请出拳")){
				System.out.println("剪刀");
				table.sendAnswer(2);
				table.playerPanel1.reloadAnswerI(2);
				table.play.setText("等待对方出拳");
				}
		}
		if(e.getSource()==answerPanel.cloth) {
			if (table.isConnect==true&&(table.play.getText()=="请出拳")){        
			System.out.println("布");        
			table.sendAnswer(3);        
			table.playerPanel1.reloadAnswerI(3);       
			table.play.setText("等待对方");
			}
		}
	}
}

class Player {   
	private String playerName,playerIP;
    private Icon playI;
    Player(String playerName){
        setPlayerName(playerName);
    }
    public Icon getPlayI() {
        return playI;
    }
    public String getPlayerIP() {
        return playerIP;
    }
    public String getPlayerName() {
        return playerName;
    }
    public void setPlayI(Icon playI) {
        this.playI = playI;
    }
    public void setPlayerIP(String playerIP) {
        this.playerIP = playerIP;
    }
    public void setPlayerName(String playerName) {
        this.playerName = playerName;
    }
}

class PlayerPanel extends JPanel{

    private JButton playerB,answerB;
    private JLabel playerLable;
    private Icon playI,answerI;
    private Player player;

    PlayerPanel(Player player){
        this.player=player;
        setBounds(0,0,120,75);
        setLayout(null);
        setBackground(Color.yellow);
        playerB = new JButton();
        playerB.setIcon(this.player.getPlayI());
        playerB.setBounds(5,5,50,50);
        answerB = new JButton();
        answerB.setBounds(65,5,50,50);
        //answerB.setEnabled(false);
        answerB.setIcon(setAnswerI(0));
        playerLable = new JLabel();
        playerLable.setBounds(5,50,100,30);
        playerLable.setText(this.player.getPlayerName());
        add(playerB);
        add(answerB);
        add(playerLable);
        validate();
    }

    public void reloadPlayer(Player player) {
        this.player = player;
        playerB.setIcon(this.player.getPlayI());
        playerLable.setText(this.player.getPlayerName());
        validate();
    }

    public void reloadAnswerI(int answer){
        answerB.setIcon(setAnswerI(answer));
        answerB.revalidate();
    }

    public Icon setAnswerI(int playI) {
        Icon icon;
        String imageName[]={"D:\\FFOutput\\石头.jpg","D:\\FFOutput\\剪刀.jpg","D:\\FFOutput\\布.jpg"};
        String imagePath="D:\\FFOutput\\time.jpg";
         switch (playI){
            case 1:
                imagePath = imageName[0];
                break;
            case 2:
                imagePath = imageName[1];
                break;
            case 3:
                imagePath = imageName[2];
                break;
        }
        icon = new ImageIcon(imagePath);
        validate();
        return icon;
    }
}

class GameServer{
    ServerSocket server=null;
    ServerThread thread;
    Socket you=null;
    GameServer (){
        while(true){
            if(server==null) {
                try {
                    server = new ServerSocket(8888);    //启动监听                   
                    System.out.println("开始监听");
                } catch (IOException e1) {
                    System.out.println("启动服务器失败。");   //ServerSocket对象不能重复创建
                }
            }

            if(server!=null) {
                try {
                    you = server.accept();
                    System.out.println("玩家地址:" + you.getInetAddress());
                } catch (IOException e) {
                    System.out.println("正在等待玩家");
                }
            }
            if(you!=null){
                //为每个客户启动一个专门的线程
                thread=new ServerThread(you);
                thread.start();
             }
            else
                continue;
        }
    }
    public static void main(String[] args) {
        new GameServer();
    }
}

class ServerThread extends Thread{
    private Socket socket;
    private DataOutputStream out=null;
    private DataInputStream in=null;
    private static int firstAnswer,secondAnswer;
    private static boolean ready;
    private int answer,result;
    private boolean isConnect,isFirst;
    private String client;
    synchronized void setFirstAnswer(int firstAnswer){
        ServerThread.firstAnswer =firstAnswer;
    }
    synchronized void setSecondAnswer(int secondAnswer){
        ServerThread.secondAnswer =secondAnswer;
    }
    synchronized int getFirstAnswer(){
        return firstAnswer;
    }
    synchronized int getSecondAnswer(){
        return secondAnswer;
    }
    synchronized void setReady(boolean ready){
        ServerThread.ready=ready;
    }
    ServerThread(Socket t){
        socket=t;
        setReady(false);
        isFirst=false;
        client=socket.getInetAddress()+":"+socket.getPort();
        try{
            in=new DataInputStream(socket.getInputStream());
            out=new DataOutputStream(socket.getOutputStream());
            System.out.println("接入客户机:"+client);
        }
        catch (IOException e){}
    }
    public void run(){
        while(true){
            isConnect=!isServerClose(socket);
            if (isConnect){
                try{
                    System.out.println("准备读取客户机"+client);
                        answer=in.readInt();
                        if (getFirstAnswer()==0){
                            setFirstAnswer(answer);
                            isFirst=true;
                        }
                        else {
                            setSecondAnswer(answer);
                            setReady(true);
                        }
                }
                catch (IOException e){
                    System.out.println("玩家离开:"+client);
                    break;
                }

                while (ready==false){
                    try {
                        Thread.sleep(800);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                match();
                try{
                    out.writeInt(result);
                    if (isFirst==true)  flush();
                }
                catch (IOException e){
                    System.out.println("玩家离开:"+client);
                    flush();
                    break;
                }
            }
            else {
                System.out.println("玩家离开:"+socket.getInetAddress());
                break;
            }
        }
    }
    private void match(){   //返回本线程可得分数,胜利锝2分,打平1分
        if (isFirst==true){
            System.out.println("是第一个出拳");
            System.out.println("second:"+secondAnswer);
            System.out.println("first:"+firstAnswer);
            result=firstAnswer-secondAnswer;
        }
        else{
            System.out.println("是第二个出拳");
            result=secondAnswer-firstAnswer;
        }
        switch (result){    //相减为零表示双方相同,
            case 0:
                result= 1;
                break;
            case 1:         //相减为1或者-2表示胜利
            case -2:
                result= 2;
                break;
            default:            //相减为1或者-2表示失败
                result= 0;
        }
    }
    private synchronized void flush(){
        firstAnswer=0;
        secondAnswer=0;
        isFirst=false;
        answer=0;
        setReady(false);
    }
    public Boolean isServerClose(Socket socket){
        try{
            socket.sendUrgentData(0xFF);//发送1个字节的紧急数据,默认情况下,服务器端没有开启紧急数据处理,不影响正常通信
            return false;
        }catch(Exception se){
            return true;
        }
    }
}
  • 写回答

6条回答 默认 最新

  • 湘水友独 2021-01-08 23:35
    关注
    try {
        server = new ServerSocket(8888);    //启动监听                   
        System.out.println("开始监听");
    } catch (IOException e1) {
        System.out.println("启动服务器失败。");   //ServerSocket对象不能重复创建
        // 打印异常堆栈
        e1.printStackTrace();
    }

    把异常堆栈打印出来看看,是什么原因

    评论

报告相同问题?

悬赏问题

  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题