(Java)通过套接字发送和映像时出错:Java.io.StreamCorruptedException:无效类型代码:3B
我正在制作一个轰炸机游戏,它需要在局域网中工作。我需要从一个客户端(游戏)向服务器发送一个图像、2个整数和一个对象,然后返回到另一个客户端(另一个游戏)。现在我只是想把所有这些东西都发送到一个游戏中,发送到服务器,然后返回到游戏中。当我第二次尝试发送图像时,我遇到了问题。这是我的服务器部件代码:(Java)通过套接字发送和映像时出错:Java.io.StreamCorruptedException:无效类型代码:3B,java,sockets,exception,stream,Java,Sockets,Exception,Stream,我正在制作一个轰炸机游戏,它需要在局域网中工作。我需要从一个客户端(游戏)向服务器发送一个图像、2个整数和一个对象,然后返回到另一个客户端(另一个游戏)。现在我只是想把所有这些东西都发送到一个游戏中,发送到服务器,然后返回到游戏中。当我第二次尝试发送图像时,我遇到了问题。这是我的服务器部件代码: public class Server { //Atributes.................................... private ServerSocket serverSock
public class Server {
//Atributes....................................
private ServerSocket serverSocket = null;
private Socket socket = null;
public boolean conected = false;
private ObjectInputStream Mensajeinput = null;
private ObjectOutputStream Mensajeoutput = null;
private DataInputStream BomberInput = null;
private DataOutputStream BomberOutput = null;
//.............................................
int X, Y;
BufferedImage CurrentSprite;
public static void main(String[] args) throws Exception {
Server Servidor = new Server();
Servidor.run();
}
public void run() throws Exception{
serverSocket = new ServerSocket(208);
socket = serverSocket.accept();
conected=true;
Mensaje Actualization= null;
while ( conected ){
//=====initialize all the input and output Streams================================
BomberInput = new DataInputStream(socket.getInputStream());
BomberOutput = new DataOutputStream(socket.getOutputStream());
Mensajeinput = new ObjectInputStream(socket.getInputStream());
Mensajeoutput = new ObjectOutputStream(socket.getOutputStream());
//=====receive and send the ints ============
X = (int) BomberInput.readInt();
BomberOutput.writeInt(X);
BomberOutput.flush();
Y = (int) BomberInput.readInt();
BomberOutput.writeInt(Y);
BomberOutput.flush();
//=========receieve and send the image=====================
CurrentSprite = (BufferedImage) ImageIO.read(BomberInput);
ImageIO.write(CurrentSprite, "GIF", BomberOutput);
//==========receive the object=================
Actualization= (Mensaje) Mensajeinput.readObject();
}
//====Close socket===============================
socket.close();
}
}
这是游戏代码的客户端部分:
M = new Mensaje(0 , 0 , 0, 0);
if (b1.isAlive()) controlPj.MoverPj(b1, M);
//*****************************INTERACTION WITH THE SERVER*****************************
//=====Initialize inputs and outputs=======
BomberOutput = new DataOutputStream(Sock.getOutputStream());
BomberInput = new DataInputStream(Sock.getInputStream());
MensajeOutput = new ObjectOutputStream(Sock.getOutputStream());
MensajeInput = new ObjectInputStream(Sock.getInputStream());
//=====Sends and receive the ints =======
BomberOutput.writeInt(b1.x);
X = BomberInput.readInt();
BomberOutput.flush();
BomberOutput.writeInt(b1.y);
Y = BomberInput.readInt();
BomberOutput.flush();
//======Sends and receive the image=======
ImageIO.write(b1.Current, "GIF", BomberOutput );
EnemmySprite = (BufferedImage) ImageIO.read(BomberInput);
//======================Sends the object==================
MensajeOutput.writeObject(M);
MensajeOutput.flush();
System.out.println("Matriz Actualizada Recibida");
//==========================================================================
//***********************************************************************************************************************
除图像部分外,所有工作正常。客户端发送映像,服务器接收映像,然后重新发送映像,客户端接收映像。但随后它抛出了这个错误:
Exception in thread "main" java.io.StreamCorruptedException: invalid type code: 3B
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1379)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371)
at bomberman2.Server.run(Server.java:90)
at bomberman2.Server.main(Server.java:42)
发生错误的特定行位于
Actualization= (Mensaje) Mensajeinput.readObject();
你知道为什么会发生这种错误吗?非常感谢您的帮助您的资料中第90行在哪里?其中没有“readObject()”。此外,您应该在读取之前执行flush()。如果执行此单线程操作,则可能会锁定。使用ImageIO.write时存在问题。相反,请将图像写入ByteArrayOutputStream,然后将生成的字节[]写入套接字,或者直接从图像文件中读取字节,然后写下我建议将客户端构造为包含所有运行时图像,而服务器是游戏逻辑的裁决者,而不是频繁发送图像数据。摆脱数据输入/输出流,并使用对象流处理所有事情。不要在同一套接字上使用多个流类型。