Java 流损坏异常无效代码:00

Java 流损坏异常无效代码:00,java,serialization,Java,Serialization,下面是MapPacket的代码片段。MapPacket扩展了PacketToClient,当从objectinputstream接收时,它基本上只调用PacketToClient上的applyToClient public void teleportToMap(String mapName, int tileX, int tileY) { player.map = mapName; currentMap = Server.mapHandler.getMap(mapName);

下面是MapPacket的代码片段。MapPacket扩展了PacketToClient,当从objectinputstream接收时,它基本上只调用PacketToClient上的applyToClient

public void teleportToMap(String mapName, int tileX, int tileY) {
    player.map = mapName;
    currentMap = Server.mapHandler.getMap(mapName);

    MapPacket mp = new MapPacket(currentMap, tileX, tileY);
    sendPacket(mp);

}
package com.common.packet.packets.client;
导入com.badlogic.gdx.gdx;
导入com.client.Forest;
导入com.client.net.ServerConnection;
导入com.client.scenes.games;
导入com.common.map.map;
导入com.common.movable.movable;
导入com.common.packet.PacketToClient;
导入java.util.ArrayList;
公共类MapPacket扩展了PacketToClient{
私有静态最终长serialVersionUID=1L;
字符串映射名;
ArrayList地面;
int-tileX,tileY;
公共映射包(映射映射、int-tileX、int-tileY){
this.mapName=map.name;
this.ground=map.getGround();
this.tileX=tileX;
this.tileY=tileY;
}
@凌驾
public void applyPacketToClient(服务器连接服务器){
Gdx.app.postRunnable(新的Runnable(){
公开募捐{
GameSecene.currentMap=null;
GameSecene.mapRenderer.setCurrentMap(null);
Map-Map=ServerConnection.loadMapFromServer(mapName);
地图背景(地面);
GameSecene.mapRenderer.setCurrentMap(地图);
GameSecene.currentMap=地图;
森林.player.setTilePosition(tileX,tileY);
}
});
}
}

我对此做了不少研究,但我总是感到冷淡。我偶尔也会遇到流活动异常。

我想说,您正在两个或多个线程中同时向流写入或读取流。这是“流活动”的唯一解释,也很可能解释另一个问题


注意,您不需要以不同的顺序创建流。始终首先创建ObjectOutputStream。您应该在Runnable的run()方法中创建这些流,而不是在您正在执行的位置:它涉及到阻塞I/O,这应该只在该线程中完成。

Ah。可以你的想法似乎删除了StreamCorruptedException(或者看起来是这样,这件事很难说,因为它只是偶尔发生。)我发送数据包的时候呢?我应该总是在线程中这样做吗?理论上,我可以在PacketCommunicator中创建另一个发送数据包的线程。调用sendPacket时,它会将数据包添加到缓冲区数组中。并将循环遍历它们,直到没有更多要发送的内容,然后等待添加更多内容。这合理吗?啊。我现在明白了。我决定在writeObject之前打印当前线程的名称,是的。有3个线程正在写入它。非常感谢你!
public void teleportToMap(String mapName, int tileX, int tileY) {
    player.map = mapName;
    currentMap = Server.mapHandler.getMap(mapName);

    MapPacket mp = new MapPacket(currentMap, tileX, tileY);
    sendPacket(mp);

}
package com.common.packet.packets.client;

import com.badlogic.gdx.Gdx;
import com.client.Forest;
import com.client.net.ServerConnection;
import com.client.scenes.GameScene;
import com.common.map.Map;
import com.common.movable.Movable;
import com.common.packet.PacketToClient;

import java.util.ArrayList;

public class MapPacket extends PacketToClient {

    private static final long serialVersionUID = 1L;

    String mapName;
    ArrayList<Movable> ground;

    int tileX, tileY;

    public MapPacket(Map map, int tileX, int tileY) {
        this.mapName = map.name;
        this.ground = map.getGround();
        this.tileX = tileX;
        this.tileY = tileY;
    }

    @Override
    public void applyPacketToClient(ServerConnection server) {
        Gdx.app.postRunnable(new Runnable() {
            public void run() {
                GameScene.currentMap = null;
                GameScene.mapRenderer.setCurrentMap(null);
                Map map = ServerConnection.loadMapFromServer(mapName);
                map.setGround(ground);
                GameScene.mapRenderer.setCurrentMap(map);
                GameScene.currentMap = map;
                Forest.player.setTilePosition(tileX, tileY);
            }
        });
    }

}