Пакет Kryonet не отправлен

Итак, я пробую крионет, отправляю специальный пакет, но слушатель на моем сервере не может его принять.

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()). Никогда ничего не печатается. Любая помощь приветствуется.


person Jimmt    schedule 10.06.2014    source источник
comment
Получает ли ваш слушатель что-нибудь? (У вас есть оператор if, но вы не сказали нам, видите ли вы полученный, но не имя пакета, или просто ничего...)   -  person Jon Skeet    schedule 10.06.2014
comment
Извините, что не уточнил - да, вообще ничего не печатается.   -  person Jimmt    schedule 10.06.2014
comment
@Jimmt, трудно сказать по фрагменту твоего кода. Пробовали ли вы их примеры приложений, пример позиции кажется достаточно простым   -  person paiv    schedule 26.06.2014
comment
Является ли Packet Serializable? На самом деле, пожалуйста, опубликуйте Packet.   -  person Elliott Frisch    schedule 27.06.2014
comment
Пакет не обязательно должен быть сериализуемым. Сделали ли вы необходимые шаги для регистрации объекта, Kryo kryo = server.getKryo(); крио.регистр(Пакет.класс); ?   -  person EpicPandaForce    schedule 27.06.2014
comment
Я думаю, что опубликую пример кода, который я написал немного назад.   -  person EpicPandaForce    schedule 27.06.2014
comment
так много для щедрости :p   -  person EpicPandaForce    schedule 27.06.2014
comment
Попробуйте увеличить размер буфера, у меня были проблемы с Kryonet из-за слишком большого пакета.   -  person tkhduracell    schedule 28.06.2014


Ответы (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 уже асинхронен, за исключением вызова метода discoveryHost(), если вы его используете.

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

Пакет.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;
    }
}

КриоКлиент.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;
    }
}

КриоСервер.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;
    }
}

КлиентТред.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();
            }

        }
    }
}

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

person EpicPandaForce    schedule 27.06.2014
comment
Кстати, у меня тоже были проблемы с подключением к портам по умолчанию, поэтому я изменил их на 2300 для TCP и 2301 для UDP. - person EpicPandaForce; 27.06.2014
comment
По какой-то странной причине это работает, когда все находится в одном файле, но когда я разделяю классы клиент/сервер и запускаю сервер, тогда у клиента возникает исходная проблема... - person Jimmt; 27.06.2014
comment
Я не знаю, поможет ли это, но лично я превратил их в одноэлементные классы. Должно быть ЧТО-ТО, что вы упускаете, если это не работает - у меня это сработало даже на кросс-платформенной платформе! - person EpicPandaForce; 27.06.2014
comment
Вы уверены, что вызываете одни и те же методы и у вас происходит то же самое? Вы пытаетесь отправить пакет только после того, как соединение установлено? Попробуйте отправить пакет в обратном вызове Connected, как я сделал в примере. - person EpicPandaForce; 27.06.2014
comment
Я буквально скопировал и вставил ваш клиентский код в свой клиентский класс, а серверный код — в серверный класс, но, похоже, это не работает. - person Jimmt; 28.06.2014
comment
Вы используете одни и те же порты? Вы используете правильный IP? Он подключается к клиенту? Я имею в виду, я знаю, что вы не получаете пакет, но действительно ли он получает событие Connected? Открыты ли порты на сервере, если они находятся на двух разных устройствах? - person EpicPandaForce; 28.06.2014
comment
Событие Connected получено, пакет - нет. Я все еще пытаюсь на своем компьютере (то же устройство) - person Jimmt; 28.06.2014
comment
Я предполагаю, что вы используете 127.0.0.1 для подключения к нему, и вы убедились, что порты одинаковы. Вы используете порты ниже 9000? У меня были проблемы с теми, кто выше 10000. Вы пытались отправить пакет в подключенном обратном вызове, как я написал выше? Это ДОЛЖНО работать. - person EpicPandaForce; 28.06.2014
comment
Как я уже сказал, я использую точно такой же код, соединение регистрируется, но ничего не получается, когда я отдельно запускаю сервер, а затем клиент в разных файлах. - person Jimmt; 28.06.2014
comment
Под другим файлом вы имеете в виду другой проект? Или просто два разных исходных файла. Если вы имеете в виду два разных исходных файла, то это должно работать, как вы видите. - person EpicPandaForce; 29.06.2014
comment
Пакет для Packet одинаков для обоих случаев, верно? - person EpicPandaForce; 29.06.2014
comment
да, это один и тот же файл - person Jimmt; 02.07.2014
comment
Вы пробовали пример, который я разместил в своем редактировании? Я попробовал это, это сработало, и у него есть материал в двух разных файлах. - person EpicPandaForce; 02.07.2014