Java套接字有时会提供UTFDataFormatException

时间:2016-05-31 14:23:48

标签: java sockets

我有一台服务器和多个客户端,有时我在服务器上遇到此异常:

31.05 07:36:11 [Server] INFO java.io.UTFDataFormatException
31.05 07:36:11 [Server] INFO at java.io.ObjectInputStream$BlockDataInputStream.readUTFSpan(ObjectInputStream.java:3137)
31.05 07:36:11 [Server] INFO at java.io.ObjectInputStream$BlockDataInputStream.readUTFBody(ObjectInputStream.java:3062)
31.05 07:36:11 [Server] INFO at java.io.ObjectInputStream$BlockDataInputStream.readUTF(ObjectInputStream.java:2874)
31.05 07:36:11 [Server] INFO at java.io.ObjectInputStream.readUTF(ObjectInputStream.java:1073)
31.05 07:36:11 [Server] INFO at java.io.ObjectStreamClass.readNonProxy(ObjectStreamClass.java:717)
31.05 07:36:11 [Server] INFO at java.io.ObjectInputStream.readClassDescriptor(ObjectInputStream.java:831)
31.05 07:36:11 [Server] INFO at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1602)
31.05 07:36:11 [Server] INFO at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1518)
31.05 07:36:11 [Server] INFO at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1774)
31.05 07:36:11 [Server] INFO at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1351)
31.05 07:36:11 [Server] INFO at java.io.ObjectInputStream.readObject(ObjectInputStream.java:371)
31.05 07:36:11 [Server] INFO at com.mlg.server.server.ClientThread.run(ClientThread.java:47)

这是服务器的代码:

    ClientThread (Socket socket, ObjectInputStream objectInputStream, ObjectOutputStream objectOutputStream) {
        this.socket = socket;
        this.objectInputStream = objectInputStream;
        this.objectOutputStream = objectOutputStream;
    }

        @Override
        public void run () {
            while (isKeepGoing()) {
                try {
                    Object o = objectInputStream.readObject(); <-- line 47
                    if (o instanceof ServerInCreateMLGPlayerPacket) {
                        // do something with it
                        continue;
                    }
} catch (Exception e) {
                    System.out.println("-------------------------");
                    System.out.println("--- " + e.getClass().getSimpleName() + " ---");
                    e.printStackTrace();
                    System.out.println("-------------------------");
                    keepGoing = false;
                }
            }
            exit();
        }

这是发送数据包:

private void sendPacket (Object o) {
    try {
        objectOutputStream.writeObject(o);
        objectOutputStream.flush();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

0 个答案:

没有答案