Kryonet packet not sent

前端 未结 1 438
抹茶落季
抹茶落季 2020-12-06 23:52

So I\'m trying out kryonet, sending a custom packet, but the listener in my server can\'t seem to pick it up.

server.addListener(new Listener() {
                   


        
相关标签:
1条回答
  • 2020-12-07 00:43

    These are the necessary steps to make KryoNet work:

    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);
    

    Of course, you can use client.sendTCP() once you've connected to the server. Replace the float[] with Packet, and it should work.

    You don't need to mess with making threads yourself, KryoNet is already asynchronous, except for the discoverHost() method call if you use it.

    EDIT: I whipped up an example project that works.

    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();
                }
    
            }
        }
    }
    

    And it works.

    0 讨论(0)
提交回复
热议问题