简体   繁体   English

Kryonet未收到自定义课程

[英]Kryonet not receiving custom classes

I'm trying to set up a basic client and server to get the hang of networking, but I'm running into a problem. 我试图建立一个基本的客户端和服务器来摆脱网络的困扰,但是我遇到了一个问题。

Whenever I send a class with one of my own classes as a variable, the server does not receive it. 每当我发送一个带有自己的类之一作为变量的类时,服务器都不会收到它。 I can use a string/int/etc for the variable perfectly fine but whenever a variable of my own type is included it is not received, along with all objects I try to send after it. 我可以使用string / int / etc作为变量,但无论何时包含我自己类型的变量,都不会接收到它,以及我尝试在其后发送的所有对象。

Everything is registered with Kryo. 一切都在Kryo中注册。 Am I just missing something? 我只是想念什么吗? Any help is appreciated! 任何帮助表示赞赏!

From GameClient: 从GameClient:

public GameClient(String name) {
    client = new Client();
    client.start();

    NetworkManager.register(client);

    listener = new ClientListener();
    client.addListener(listener);

    try {
        client.connect(5000, "24.207.67.56", NetworkManager.port);
    } catch (Exception e) {
        e.printStackTrace();
    }

    Login login2 = new Login();
    User user2 = new User(name);
    login2.user = user2;
    login2.name = user2.name;
    client.sendTCP(login2); // server does not recieve this

    Login login = new Login();
    login.name = user.name;
    client.sendTCP(login); // server receives this only when it is sent before the Login containing the User

}

From GameServer : 从GameServer:

public GameServer() {
    server = new Server();

    NetworkManager.register(server);

    listener = new ServerListener(server);
    server.addListener(listener);

    try {
        server.bind(NetworkManager.port);
    } catch (IOException e) {
        e.printStackTrace();
    }
    server.start();
}

In ServerListener: 在ServerListener中:

@Override
public void received(Connection c, Object o) {
    System.out.println("recieved");
    if (o instanceof Login) {
        System.out.println("[SERVER] " + ((Login) o).name + " logged in.");
        LoginResult lr = new LoginResult();
        lr.result = true;
        c.sendTCP(lr);
    }
}

From NetworkManager: 从NetworkManager:

public static void register(EndPoint endPoint) {
    Kryo kryo = endPoint.getKryo();
    kryo.register(Login.class);
    kryo.register(User.class);
}

public static class Login {
    public User user;
    public String name;
}

User: 用户:

public class User {
    public String name;

    public User(String name) {
        this.name = name;
    }
}

So it turns out that the problem was caused by the lack of default constructor in the User class. 因此事实证明,问题是由User类中缺少默认构造函数引起的。 Removing the User(String name) constructor or adding a plain User() constructor fixes the issue. 删除User(String name)构造函数或添加普通的User()构造函数可以解决此问题。

It would be useful if it threw an error when you tried to do it incorrectly, but oh well. 如果您在尝试错误操作时抛出错误,它将很有用,但是,哦。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM