我正在尝试制作一名炸弹人 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)
这是我第一次尝试客户端-服务器通信,我将不胜感激任何建议! 谢谢。
最佳答案
您将在服务器和客户端的每个循环上打开一个新的 ObjectOutputStream
和 ObjectInputStream
。您只需为每个套接字打开一次。
关于java - 炸弹人网络通讯-无法发送炸弹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44553958/