java - 在 kryonet 中发送和接收数组

标签 java arrays packet kryo kryonet

我正在使用 kryonet 创建服务器/客户端系统。

我正在尝试从服务器向我的客户端发送一个int[][]。为了完成这个任务,我尝试了这个:

publc class ArrayPacket {
 public int[][] array
}

然后,在server listener中我写道:

ArrayPacket myPacket = new ArrayPacket();
for (int y = 0; y < Level.height; y++) {
    for (int x = 0; x < Level.width; x++) {
        myPacket.id[x][y] = somethingAt[x][y];
    }
}
clientConnection.sendTCP(myPacket);

最后,在客户端监听器中,我收到 ArrayPacket:

public void received(Connection con, Object object) {
            if (object instanceof ArrayPacket) {
                for (int y = 0; y < Level.height; y++) {
                    for (int x = 0; x < Level.width; x++) {             
                        somethingAt[x][y] = ((ArrayPacket) object).array[x][y];
                    }
                }
            }
        }

然后我注册所有类似的东西:

public void register(Kryo k) {
    k.register(ArrayPacket.class);
    k.register(int[][].class);
}

但是,当我运行它时,它抛出一个错误提示我必须注册 int[].class。所以我这样做,再次运行程序,编译器向我抛出一个 BufferOverflowException:

Exception in thread "Server" com.esotericsoftware.kryo.KryoException: java.nio.BufferOverflowException
Serialization trace:
array (myPackage.ArrayPacket)
    at com.esotericsoftware.kryo.serializers.FieldSerializer$ObjectField.write(FieldSerializer.java:585)
    at com.esotericsoftware.kryo.serializers.FieldSerializer.write(FieldSerializer.java:213)
    at com.esotericsoftware.kryo.Kryo.writeClassAndObject(Kryo.java:571)
    at com.esotericsoftware.kryonet.KryoSerialization.write(KryoSerialization.java:50)
    at com.esotericsoftware.kryonet.TcpConnection.send(TcpConnection.java:192)
    at com.esotericsoftware.kryonet.Connection.sendTCP(Connection.java:59)
    at myPackage.MyServerListener.received(ServerListener.java:28)
    at com.esotericsoftware.kryonet.Server$1.received(Server.java:61)
    at com.esotericsoftware.kryonet.Connection.notifyReceived(Connection.java:246)
    at com.esotericsoftware.kryonet.Server.update(Server.java:208)
    at com.esotericsoftware.kryonet.Server.run(Server.java:356)
    at java.lang.Thread.run(Thread.java:724)

Caused by: java.nio.BufferOverflowException
    at java.nio.HeapByteBuffer.put(HeapByteBuffer.java:183)
    at com.esotericsoftware.kryo.io.ByteBufferOutputStream.write(ByteBufferOutputStream.java:42)
    at com.esotericsoftware.kryo.io.Output.flush(Output.java:154)
    at com.esotericsoftware.kryo.io.Output.require(Output.java:134)
    at com.esotericsoftware.kryo.io.Output.writeInt(Output.java:246)
    at com.esotericsoftware.kryo.serializers.DefaultArraySerializers$IntArraySerializer.write(DefaultArraySerializers.java:55)
    at com.esotericsoftware.kryo.serializers.DefaultArraySerializers$IntArraySerializer.write(DefaultArraySerializers.java:45)
    at com.esotericsoftware.kryo.Kryo.writeObjectOrNull(Kryo.java:552)
    at com.esotericsoftware.kryo.serializers.DefaultArraySerializers$ObjectArraySerializer.write(DefaultArraySerializers.java:312)
    at com.esotericsoftware.kryo.serializers.DefaultArraySerializers$ObjectArraySerializer.write(DefaultArraySerializers.java:293)
    at com.esotericsoftware.kryo.Kryo.writeObjectOrNull(Kryo.java:552)
    at com.esotericsoftware.kryo.serializers.FieldSerializer$ObjectField.write(FieldSerializer.java:570)
    ... 11 more

那么,我该如何解决这个错误呢?

提前致谢。

最佳答案

好吧,我解决了这个问题。这很简单:我只是增加了服务器和客户端可以接收的数据量。

关于java - 在 kryonet 中发送和接收数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25220097/

相关文章:

java - 删除字段具有指定值的记录

PHP用数组插入sql

php - 合并数组,即使它们不存在于 PHP

javascript - 根据数值数组的第一个值和最后一个值对数值数组进行排序

sockets - 编写一个程序来形成自己的IP数据包需要什么?

java - 确定 CSV 文件中的分类数据与数值数据 --

java - java中的非静态 block 有什么用?

java - 使用 AJAX 和 Spring Boot 从磁盘删除文件

networking - 通过 Internet 发送 UDP 数据包

http - Wireshark 如何将 TCP 数据包的协议(protocol)识别为 HTTP?