Пакет Крионет не отправлен

Так что я пытаюсь крионеть, отправляя пользовательский пакет, но слушатель на моем сервере не может его поднять.

server.addListener(new Listener() {
            @SuppressWarnings("unused")
            public void received(Connection connection, Object object) {
                System.out.println("received");
                if (object instanceof Packet) {
                        Packet p = (Packet) object;
                        System.out.println(p.name);

                }
            }
        });

Посылка:

            Packet p = new Packet();
        p.name = "test";
        client.sendTCP(p);

Читая другие темы, я пытался использовать new Thread(client).start(); вместо client.start();и я добавил пустые конструкторы в мои классы пакетов, но клиент либо подключается, затем зависает и никогда не отключается (если я использую новый поток (клиент).start ()) или подключается, то сразу отключается (если я используя client.start ()). Ничего не напечатано. Любая помощь приветствуется.

1 ответ

Это необходимые шаги для работы KryoNet:

Server server = new Server();
Kryo kryo = server.getKryo();
kryo.register(float[].class);
server.start();
server.bind(2300, 2301);
server.addListener(new Listener() {
    public void received(Connection connection, Object object)
    {
        if(object instanceof float[])
        {
            float[] array = (float[])object;
        } 
    }
});

Client client = new Client();
Kryo kryo = client.getKryo();
kryo.register(float[].class);
client.addListener(new Listener() {
    public void connected(Connection connection)
    {
        connection.sendTCP(new float[] {5.0f, 6.0f, 7.0f, 8.0f});
    }
});
client.start();
client.connect(5000, "127.0.0.1”, 2300, 2301);

Конечно, вы можете использовать client.sendTCP() после подключения к серверу. Замените float[] на Packet, и он должен работать.

Вам не нужно возиться с созданием потоков самостоятельно, KryoNet уже асинхронен, за исключением вызова метода exploreHost(), если вы его используете.

РЕДАКТИРОВАТЬ: я набрал пример проекта, который работает.

Packet.java:

public class Packet
{
    private String message;

    public Packet()
    {
    }

    public Packet(String message)
    {
        this.message = message;
    }

    public String getMessage()
    {
        return message;
    }

    public void setMessage(String message)
    {
        this.message = message;
    }
}

KryoClient.java:

public class KryoClient
{
    private Client client;

    public KryoClient() throws IOException
    {
        client = new Client();
        Kryo kryo = client.getKryo();
        kryo.register(float[].class);
        kryo.register(Packet.class);
        //kryo.register(String.class);
        client.addListener(new Listener() {
            public void connected(Connection connection)
            {
                //connection.sendTCP(new float[] {5.0f, 6.0f, 7.0f, 8.0f});
                connection.sendTCP(new Packet("Hello, Server! You're sexy, rawr :3"));
            }

            @Override
            public void received(Connection connection, Object object)
            {
                if (object instanceof float[])
                {
                    float[] array = (float[]) object;
                    for(float a : array)
                    {
                        System.out.println(a);
                    }
                }
                else if(object instanceof Packet)
                {
                    Packet packet = (Packet) object;
                    System.out.println("Message: " + packet.getMessage());
                    connection.sendTCP(new Packet("The packet has arrived to client."));
                }
            }

            @Override
            public void disconnected(Connection arg0)
            {
                System.out.println("Server disconnected.");
            }
        });
        client.start();
        client.connect(5000, "127.0.0.1", 2305, 2306);
    }

    public Client getClient()
    {
        return client;
    }

    public void setClient(Client client)
    {
        this.client = client;
    }
}

KryoServer.java:

public class KryoServer
{
    private Server server;

    public KryoServer() throws IOException
    {
        server = new Server();
        Kryo kryo = server.getKryo();
        kryo.register(float[].class);
        kryo.register(Packet.class);
        //kryo.register(String.class);
        server.start();
        server.bind(2305, 2306);
        server.addListener(new Listener()
        {
            @Override
            public void connected(Connection connection)
            {
                connection.sendTCP(new Packet("Server says, connected to server."));
            }

            @Override
            public void received(Connection connection, Object object)
            {
                if (object instanceof float[])
                {
                    float[] array = (float[]) object;
                    for(float a : array)
                    {
                        System.out.println(a);
                    }
                }
                else if(object instanceof Packet)
                {
                    Packet packet = (Packet) object;
                    System.out.println("Message: " + packet.getMessage());
                    //connection.sendTCP(new Packet("The packet has arrived to server."));
                }
            }

            @Override
            public void disconnected(Connection connection)
            {
                System.out.println("Client disconnected.");
            }
        });
    }

    public Server getServer()
    {
        return server;
    }

    public void setServer(Server server)
    {
        this.server = server;
    }
}

ClientThread.java:

public class ClientThread extends Thread
{
    private KryoClient client;
    private volatile boolean running;

    public ClientThread(KryoClient client)
    {
        this.client = client;
        running = true;
    }

    @Override
    public void run()
    {
        long initTime = System.currentTimeMillis();
        while(running)
        {
            if(System.currentTimeMillis() - initTime > 1000)
            {
                initTime = System.currentTimeMillis();
                client.getClient().sendTCP(new Packet("Hello from " + System.currentTimeMillis()));
                //should have used Thread.sleep(1000); instead
            }
        }
    }

    public void stopThread()
    {
        running = false;
    }
}

MyMain.java:

public class MyMain
{
    private static KryoClient kryoClient = null;
    private static KryoServer kryoServer = null;
    private static ClientThread thread = null;

    public static void main(String[] args) throws IOException
    {
        BufferedReader br = null;
        System.out.println("What's up, doc?");
        System.out.println("Press '1' for server.");
        System.out.println("Press '2' for client.");

        try
        {
            br = new BufferedReader(new InputStreamReader(System.in));
            String line = br.readLine();
            int number = Integer.parseInt(line);
            if (number == 1)
            {
                kryoServer = new KryoServer();
                System.out.println("Server started.");
            }
            else if (number == 2)
            {
                kryoClient = new KryoClient();
                System.out.println("Client started.");
                thread = new ClientThread(kryoClient);
                thread.start();
            }
            System.out.println("Press a button to exit.");
            br.readLine();

            System.out.println("Test end.");
        }
        finally
        {
            if(kryoClient != null)
            {
                kryoClient.getClient().stop();
            }
            if(kryoServer != null)
            {
                kryoServer.getServer().stop();
            }

            if (br != null)
            {
                br.close();
            }
            if (thread != null)
            {
                thread.stopThread();
            }

        }
    }
}

И это работает.

Другие вопросы по тегам