java - 炸弹人网络通讯-无法发送炸弹

标签 java server client

我正在尝试制作一名炸弹人 MP,一切都很好,玩家、障碍物等等,但没有炸弹。每次我放置炸弹时,它都不会发送并崩溃并抛出异常。现在我正在发送炸弹协调(bX,bY),我尝试将炸弹作为对象发送,但也没有成功。那么我该如何摆脱这个异常呢?我该如何做才是正确的?

这是我的服务器代码:

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);
        }

    }

这是我的客户端代码:

    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。

但有一个异常(exception)。

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)

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

最佳答案

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

关于java - 炸弹人网络通讯-无法发送炸弹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44553958/

相关文章:

java - 使用带有未知数量参数的 guava Sets.cartesianProduct

java - 将两个整数保存为一个

ruby-on-rails - 优胜美地意外关闭后 Postgres 服务器未启动

ubuntu - 在 Linux 服务器上提供 Go API

clojure - HTTP 套件 WebSocket 客户端

Java hadoop api YarnClient没有 "init()/start()"功能?

java - tomcat 环境中的 H2 数据库在选择 sequence.nextval 时抛出 RuntimeException "unexpected code path"

java - 在 Java 应用程序中使用 Mahout

java - 通过 tcp 套接字从 java 服务器向 Android 客户端返回消息

ios - 在 Unity 中接收来自客户端的消息