蒟蒻接触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;
}
}
}