2017-06-14 13 views
1

私はボンバーマンのMPを作りようとしていますが、すべてがうまくいきます、プレーヤー、障害物などが爆弾です。私が爆弾を置くたびに、それを送信せずクラッシュして例外をスローします。今、私は爆弾の調整(bX、bY)を送信しています。私はオブジェクトとして爆弾を送ろうとしましたが、成功もありませんでした。だから私はこの例外をどのように取り除くと思いますか?そして私はそれをどうやって正しいと思いますか?ボンバーマンネットワーク通信 - 爆弾を送ることはできません

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は毎回スペースバーを押すと呼ばれている(爆弾をドロップ):

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

    } 

はここに私のクライアントコードです:

は、ここに私のサーバーのコードです。

例外があります。

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) 

これは私のクライアントとサーバー間の通信の最初の試みですが、私はどんな提案もありがとう! ありがとうございます。

答えて

0

サーバーとクライアントの両方のループごとに、新しいObjectOutputStreamObjectInputStreamがオープンしています。ソケットごとに一度だけ開く必要があります。

+0

お返事ありがとうございます!しかし、私はそれをすべてのループでやっていけないとき、それはちょうどうまくいってから何も送ってこない。したがって、運動などのコミュニケーションはありません。 – PogChamp69

関連する問題