Java StreamCorruptedException:格式错误:56

Java StreamCorruptedException:格式错误:56,java,android,Java,Android,在此期间,我开发了一个android应用程序,使用Object[Input/Output]Stream发送/接收消息,下面的代码是发送方法: public void sendMsg(Message msg) { try { if(connectedFalg) { outputStream.reset(); outputStream.writeObject(msg); outputStream.flus

在此期间,我开发了一个android应用程序,使用Object[Input/Output]Stream发送/接收消息,下面的代码是发送方法:

public void sendMsg(Message msg) {
    try {
        if(connectedFalg) {
            outputStream.reset();
            outputStream.writeObject(msg);
            outputStream.flush();
        }
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
同时,有一个线程一直在接收消息,代码如下:

while(true) {
    try {
        Message msg = (Message) inputStream.readObject();
        BufferManager.INSTANCE.addReceiveQueue(msg);
    } catch (OptionalDataException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
public boolean collisionCalculate(float ballaTempXY[],AbstractBall balla,AbstractBall ballb)
{       

    Value bvalue = KVStoreInMemory.INSTANCE.getVersionValue(new Key(ballb.getBallId())).getValue();
    float[] bloc = bvalue.getLoc();

    float BAx = ballaTempXY[0] - bloc[0];
    float BAy = ballaTempXY[1] - bloc[1];

    float mvBA = mould(new float[]{BAx, BAy});  

    if(mvBA > (balla.getRadius() + ballb.getRadius())){

        return false;
    }

    float[] bv = bvalue.getV();

    float vB = (float)Math.sqrt(bv[0] * bv[0] + bv[1] * bv[1]);

    float vbCollX = 0;
    float vbCollY = 0;
    //垂直方向的Xy分速度
    float vbVerticalX=0;
    float vbVerticalY=0;

    if(balla.getVMin() < vB)
    {
        float bAngle=angle
        (
            new float[]{bv[0],bv[1]},
            new float[]{BAx,BAy}
        );

        float vbColl=vB * (float)Math.cos(bAngle);

        vbCollX = (vbColl/mvBA) * BAx;
        vbCollY = (vbColl/mvBA) * BAy;

        vbVerticalX = bv[0] - vbCollX;
        vbVerticalY = bv[1] - vbCollY;
    }

    Value avalue = KVStoreInMemory.INSTANCE.getVersionValue(new Key(balla.getBallId())).getValue();

    float[] av = avalue.getV();

    float vA = (float)Math.sqrt(av[0] * av[0] + av[1] * av[1]);
    //平行方向的Xy分速度
    float vaCollX = 0;
    float vaCollY = 0;
    //垂直方向的Xy分速度
    float vaVerticalX = 0;
    float vaVerticalY = 0;

    if(balla.getVMin() < vA)
    {
        float aAngle=angle
        (
            new float[]{av[0],av[1]},
            new float[]{BAx,BAy}
        );          

        float vaColl=vA*(float)Math.cos(aAngle);

        vaCollX=(vaColl/mvBA)*BAx;
        vaCollY=(vaColl/mvBA)*BAy;

        vaVerticalX = av[0]-vaCollX;
        vaVerticalY = av[1]-vaCollY;
    }

    av[0] = vaVerticalX + vbCollX;
    av[1] = vaVerticalY + vbCollY;
    avalue.setV(av[0], av[1]);

    RegisterControllerFactory.INSTANCE.getRegisterController().write(new Key(balla.getBallId()), avalue);
    System.out.println("write balla "+balla.getBallId());
    bv[0] = vbVerticalX + vaCollX;
    bv[1] = vbVerticalY + vaCollY;

    bvalue.setV(bv[0], bv[1]);
    RegisterControllerFactory.INSTANCE.getRegisterController().write(new Key(ballb.getBallId()), bvalue);
    System.out.println("write ballb "+ballb.getBallId());

    return true;
}
在我的项目中,我有三个球,一个球是目标球,其他的都是由手机通过加速传感器控制的,我先发送1号球的状态,然后发送2号球或目标球,然后会有一些异常,比如:

java.io.StreamCorruptedException:Wrong format:56
05-15 21:53:02.220: W/System.err(5923):     at java.io.ObjectInputStream.corruptStream(ObjectInputStream.java:676)
05-15 21:53:02.230: W/System.err(5923):     at java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:789)
有时它会遇到这样的问题:

05-16 15:42:28.380: W/System.err(14690): java.io.UTFDataFormatException: bad byte at 122
05-16 15:42:28.380:W/System.err(14690):at java.nio.charset.ModifiedUtf8.decode(ModifiedUtf8.java:60) 05-16 15:42:28.380:W/System.err(14690):位于java.io.DataInputStream.decodeUTF(DataInputStream.java:179) 05-16 15:42:28.380:W/System.err(14690):位于java.io.DataInputStream.decodeUTF(DataInputStream.java:173) 05-16 15:42:28.380:W/System.err(14690):位于java.io.DataInputStream.readUTF(DataInputStream.java:169) 05-16 15:42:28.380:W/System.err(14690):位于java.io.ObjectInputStream.ReadFieldDescriptor(ObjectInputStream.java:895) 05-16 15:42:28.380:W/System.err(14690):位于java.io.ObjectInputStream.readClassDescriptor(ObjectInputStream.java:1719) 05-16 15:42:28.380:W/System.err(14690):位于java.io.ObjectInputStream.readNewClassDesc(ObjectInputStream.java:1631) 05-16 15:42:28.380:W/System.err(14690):位于java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:658) 05-16 15:42:28.380:W/System.err(14690):位于java.io.ObjectInputStream.readNewObject(ObjectInputStream.java:1781) 05-16 15:42:28.380:W/System.err(14690):位于java.io.ObjectInputStream.readNonPrimitiveContent(ObjectInputStream.java:762) 05-16 15:42:28.380:W/System.err(14690):位于java.io.ObjectInputStream.readObject(ObjectInputStream.java:1981) 05-16 15:42:28.380:W/System.err(14690):位于java.io.ObjectInputStream.readObject(ObjectInputStream.java:1938)

这就是这个项目

如果两个球发生碰撞,则将调用collisionCalculate()方法,方法如下:

while(true) {
    try {
        Message msg = (Message) inputStream.readObject();
        BufferManager.INSTANCE.addReceiveQueue(msg);
    } catch (OptionalDataException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}
public boolean collisionCalculate(float ballaTempXY[],AbstractBall balla,AbstractBall ballb)
{       

    Value bvalue = KVStoreInMemory.INSTANCE.getVersionValue(new Key(ballb.getBallId())).getValue();
    float[] bloc = bvalue.getLoc();

    float BAx = ballaTempXY[0] - bloc[0];
    float BAy = ballaTempXY[1] - bloc[1];

    float mvBA = mould(new float[]{BAx, BAy});  

    if(mvBA > (balla.getRadius() + ballb.getRadius())){

        return false;
    }

    float[] bv = bvalue.getV();

    float vB = (float)Math.sqrt(bv[0] * bv[0] + bv[1] * bv[1]);

    float vbCollX = 0;
    float vbCollY = 0;
    //垂直方向的Xy分速度
    float vbVerticalX=0;
    float vbVerticalY=0;

    if(balla.getVMin() < vB)
    {
        float bAngle=angle
        (
            new float[]{bv[0],bv[1]},
            new float[]{BAx,BAy}
        );

        float vbColl=vB * (float)Math.cos(bAngle);

        vbCollX = (vbColl/mvBA) * BAx;
        vbCollY = (vbColl/mvBA) * BAy;

        vbVerticalX = bv[0] - vbCollX;
        vbVerticalY = bv[1] - vbCollY;
    }

    Value avalue = KVStoreInMemory.INSTANCE.getVersionValue(new Key(balla.getBallId())).getValue();

    float[] av = avalue.getV();

    float vA = (float)Math.sqrt(av[0] * av[0] + av[1] * av[1]);
    //平行方向的Xy分速度
    float vaCollX = 0;
    float vaCollY = 0;
    //垂直方向的Xy分速度
    float vaVerticalX = 0;
    float vaVerticalY = 0;

    if(balla.getVMin() < vA)
    {
        float aAngle=angle
        (
            new float[]{av[0],av[1]},
            new float[]{BAx,BAy}
        );          

        float vaColl=vA*(float)Math.cos(aAngle);

        vaCollX=(vaColl/mvBA)*BAx;
        vaCollY=(vaColl/mvBA)*BAy;

        vaVerticalX = av[0]-vaCollX;
        vaVerticalY = av[1]-vaCollY;
    }

    av[0] = vaVerticalX + vbCollX;
    av[1] = vaVerticalY + vbCollY;
    avalue.setV(av[0], av[1]);

    RegisterControllerFactory.INSTANCE.getRegisterController().write(new Key(balla.getBallId()), avalue);
    System.out.println("write balla "+balla.getBallId());
    bv[0] = vbVerticalX + vaCollX;
    bv[1] = vbVerticalY + vaCollY;

    bvalue.setV(bv[0], bv[1]);
    RegisterControllerFactory.INSTANCE.getRegisterController().write(new Key(ballb.getBallId()), bvalue);
    System.out.println("write ballb "+ballb.getBallId());

    return true;
}
public boolean collisionCalculate(float-ballaTempXY[],AbstractBall-balla,AbstractBall-ballb)
{       
Value bvalue=KVStoreInMemory.INSTANCE.getVersionValue(新键(ballb.getBallId()).getValue();
float[]bloc=bvalue.getLoc();
float BAx=ballaTempXY[0]-bloc[0];
浮舱=BallatePxy[1]-浮舱[1];
浮动mvBA=模具(新浮动[]{BAx,间隔});
如果(mvBA>(balla.getRadius()+ballb.getRadius()){
返回false;
}
float[]bv=bvalue.getV();
float vB=(float)Math.sqrt(bv[0]*bv[0]+bv[1]*bv[1]);
float vbCollX=0;
float vbCollY=0;
//垂直方向的Xy分速度
浮动vbVerticalX=0;
浮动vbVerticalY=0;
if(balla.getVMin()
您已经向流中写入了其他内容,但没有使用与写入方法相反的方法读取,因此您现在不同步,您是在Android上运行客户端和服务器端,还是在Android上运行客户端和服务器端,在PC上运行java server?java实现在Android java和JDK之间可能有所不同,我建议您使用更严格的协议进行通信,而不仅仅依赖readObject的内部实现我在Android手机上同时运行客户端和服务器端。@jobcrazy如果不严格,为什么会抛出此异常?