簡體   English   中英

Java Kryonet [類未注冊異常]

[英]Java Kryonet [Class is not registered Exception ]

我發現這個名為 Kryonet 的API 好吧,我嘗試實現項目頁面中提供的示例。 然而,它並不成功。

服務器代碼:

public class KryoTest {

public KryoTest() throws IOException {
    Server server = new Server();
    server.start();
    server.bind(54555, 54777);
    server.addListener(new Listener() {

        public void received(Connection connection, Object object) {
            if (object instanceof SomeRequest) {
                SomeRequest request = (SomeRequest) object;
                System.out.println(request.text);

                SomeResponse response = new SomeResponse();
                response.text = "Thanks!";
                connection.sendTCP(response);
            }
        }
    });
    Kryo kryo = server.getKryo();
    kryo.register(SomeRequest.class);
    kryo.register(SomeResponse.class);
}

public static void main(String[] args) throws IOException {
    new KryoTest();
}}

客戶代碼:

    public class Kryoclient {

    public Kryoclient() throws IOException {
    Client client = new Client();
client.start();
client.connect(5000,"192.168.1.4", 54555, 54777);

SomeRequest request = new SomeRequest();
request.text = "Here is the request!";
client.sendTCP(request);

 Kryo kryo = client.getKryo();
kryo.register(SomeRequest.class);
kryo.register(SomeResponse.class);

}
    public static void main(String[] args) throws IOException {
        new Kryoclient();
    }
}

例外:

run:
00:00  INFO: Connecting: /192.168.1.4:54555/54777
00:00  INFO: [kryonet] Connection 1 connected: /192.168.1.4
Exception in thread "main" java.lang.IllegalArgumentException: Class is not registered: client.SomeRequest
    at com.esotericsoftware.kryo.Kryo.getRegisteredClass(Kryo.java:319)
    at com.esotericsoftware.kryo.Kryo.writeClass(Kryo.java:374)
    at com.esotericsoftware.kryo.Kryo.writeClassAndObject(Kryo.java:484)
    at com.esotericsoftware.kryonet.TcpConnection.send(TcpConnection.java:196)
    at com.esotericsoftware.kryonet.Connection.sendTCP(Connection.java:68)
    at client.Kryoclient.<init>(Kryoclient.java:24)
    at client.Kryoclient.main(Kryoclient.java:30)

這段代碼有什么問題?

我以前從未聽說過 Kryonet,但我認為您需要將kryo.register(...)行移動到客戶端或服務器分別嘗試連接或接受連接之前。

Kryoserver 是一個非常好的多線程客戶端-服務器管理器。

在連接客戶端並啟動或綁定到服務器之前,您必須注冊在客戶端和服務器上發送和接收的所有類(以相同的順序)。

代碼順序應該是這樣的:

//創建服務器實例

服務器服務器 = 新服務器();

//從服務器實例創建 Kryo 實例並注冊您將通過網絡發送的類。

Kryo kryo = server.getKryo();

kryo.register(ClassNameYouWant.class);

//添加監聽器

server.addListener(...);

//綁定端口

server.bind(4345);

//現在才啟動服務器。

server.start();

在您的代碼中,您在注冊類和添加偵聽器之前啟動了服務器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM