首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Bomberman网络通信-不能发送炸弹

Bomberman网络通信-不能发送炸弹
EN

Stack Overflow用户
提问于 2017-06-15 04:14:29
回答 1查看 102关注 0票数 1

我正在试着做一个炸弹人议员,一切都很好,玩家,障碍物,等等,除了炸弹。每次我放置炸弹时,它都不发送它,崩溃并抛出异常。现在我正在发送炸弹坐标(bX,bY),我试图将炸弹作为对象发送,但同样没有成功。那么我该如何摆脱这个异常呢?我该怎么做才对呢?

下面是我的服务器代码:

代码语言:javascript
复制
public class Server implements Runnable, Serializable, ActionListener{
    Thread vlakno = new Thread(this);
    ServerSocket server;
    Socket soc;
    int bX, bY;
    Player pl;
    Player pl2 = new Player(500, 27, 0, 0, "img/player.png");
    ViewMP view;

    ArrayList<Map> Maplist;
    ArrayList<Map> brmap = new ArrayList();
    ArrayList<Bonus> Bonuslist;
    ArrayList<Bomb> bList;

    ObjectInputStream ois;
    ObjectOutputStream oos;

    public Server(){
        vlakno.start();
    }

    @Override
    public synchronized void run() {
        try {
            view = new ViewMP(pl2, 50);
            view.setTitle("Server");
            view.setListen(this);

            komunikuj();
        } catch (IOException ex) {
            Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
        } catch (InterruptedException ex) {
            Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
        } catch (AWTException ex) {
            Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    private synchronized void komunikuj() throws IOException, ClassNotFoundException{
        server = new ServerSocket(1252);
        soc = server.accept();

        oos = new ObjectOutputStream(soc.getOutputStream());
        ois = new ObjectInputStream(soc.getInputStream());

        Bonuslist = (ArrayList<Bonus>) ois.readObject();
        oos.writeObject(view.getBonus());
        view.setBonus(Bonuslist);


        while(true){
            try {
                oos = new ObjectOutputStream(soc.getOutputStream());
                ois = new ObjectInputStream(soc.getInputStream());

                pl = (Player) ois.readObject();
                oos.writeObject(view.getPl());
                view.setPl2(pl);

                Maplist = (ArrayList<Map>) ois.readObject();
                oos.writeObject(view.getBreakableMap());
                view.setBreakableMap(brmap);

                oos.writeObject(null);
                if (ois.readObject() != null) {
                    System.out.println("XD");
                    bX = (int) ois.readObject();
                    bY = (int) ois.readObject();
                }

            } catch (Exception e){

            }
        }
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        try {
            oos.reset();
            oos.writeObject(view.getbX());
            oos.writeObject(view.getbY());
            view.addBomb(new Bomb(bX, bY,  0, pl2, 0));
        } catch (IOException ex) {
            Logger.getLogger(Server.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

下面是我的客户端代码:

代码语言:javascript
复制
    package bomberman;

import java.awt.AWTException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Timer;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Client implements Runnable, Serializable, ActionListener{
    Thread vlakno = new Thread(this);
    Socket soc;
    ViewMP view;
    Player pl2 = new Player(27, 5, 0, 0, "img/player.png");
    ArrayList<Map> list;
    ArrayList<Bomb> bList;
    ArrayList<Bonus> Bonuslist;

    int bX, bY;

    ObjectInputStream ois;
    ObjectOutputStream oos;

    String add;

    public Client(String add) {
        vlakno.start();
        this.add = add;
    }

    @Override
    public synchronized void run() {
        try {
            view = new ViewMP(pl2, 50);
            view.setListen(this);
        } catch (InterruptedException ex) {
            Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
        } catch (AWTException ex) {
            Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
        }

        view.setTitle("Client");
        try {
            soc = new Socket(add, 1252);
            System.out.println(soc.getLocalAddress());

            oos = new ObjectOutputStream(soc.getOutputStream());
            ois = new ObjectInputStream(soc.getInputStream());

            oos.writeObject(view.getBonus());
            Bonuslist = (ArrayList<Bonus>) ois.readObject();

            while(true){
                oos = new ObjectOutputStream(soc.getOutputStream());
                ois = new ObjectInputStream(soc.getInputStream());

                oos.writeObject(view.getPl());
                pl2 = (Player) ois.readObject();
                view.setPl2(pl2);

                oos.writeObject(view.getBreakableMap());
                list = (ArrayList<Map>) ois.readObject();
                view.setBreakableMap(list);

                oos.writeObject(null);
                if (ois.readObject() != null) {
                    System.out.println("XD");
                    bX = (int) ois.readObject();
                    bY = (int) ois.readObject();
                }


            }
        } catch (IOException ex) {
            Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        try {
            oos.reset();
            oos.writeObject(view.getbX());
            oos.writeObject(view.getbY());

            view.addBomb(new Bomb(bX, bY,  0, pl2, 0));
        } catch (IOException ex) {
            Logger.getLogger(Client.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}

每次按下空格键时都会调用ActionListener (投掷炸弹)。

但也有例外。

代码语言:javascript
复制
java.io.StreamCorruptedException: invalid type code: AC
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1379)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371)
at bomberman.Client.run(Client.java:67)
at java.lang.Thread.run(Thread.java:745)

这是我第一次尝试客户端-服务器通信,如果有任何建议,我将不胜感激!谢谢。

EN

回答 1

Stack Overflow用户

发布于 2017-06-15 04:38:39

您将在服务器和客户端的每个循环中打开一个新的ObjectOutputStreamObjectInputStream。您只需要在每个套接字中打开它们一次。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44553958

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档