【问题标题】:Kryonet packet not sentKryonet 数据包未发送
【发布时间】:2014-12-28 00:44:29
【问题描述】:

所以我正在尝试 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();,并且我在我的数据包类中添加了空构造函数,但是客户端要么连接,然后挂起并且永远不会断开连接(如果我使用 new Thread(client).start()) 或连接然后立即断开连接(如果我使用的是 client.start())。没有任何东西被打印出来。任何帮助表示赞赏。

【问题讨论】:

  • 您的听众是否收到任何东西? (你有一个if 声明,但你没有告诉我们你是否看到“已收到”但没有看到数据包名称,或者什么都没有......)
  • 很抱歉没有澄清 - 是的,根本没有打印任何内容。
  • @Jimmt,很难从代码的 sn-p 中分辨出来。您是否尝试过他们的示例应用程序,position sample 似乎相当简单
  • Packet Serializable?其实请发帖Packet
  • 数据包不必是可序列化的。你是否做了必要的步骤来注册对象,Kryo kryo = server.getKryo(); kryo.register(Packet.class); ?

标签: java kryonet


【解决方案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 已经是异步的了,除非你使用了 discoverHost() 方法调用。

编辑:我创建了一个可行的示例项目。

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

        }
    }
}

它有效。

【讨论】:

  • 顺便说一句,我在连接默认端口时也遇到了问题 - 这就是为什么我将它们更改为 TCP 的 2300 和 UDP 的 2301。
  • 出于某种奇怪的原因,当所有内容都在一个文件中时它可以工作,但是当我分成客户端/服务器类并运行服务器时,客户端我遇到了原始问题......跨度>
  • 我不知道这是否有帮助,但我个人将它们变成了单例类。如果它不起作用,那么您一定会丢失一些东西 - 它甚至对我来说也适用于跨平台!
  • 你确定你调用的是完全相同的方法,并且你有同样的事情吗?您是否仅在建立连接后才尝试发送数据包?尝试像我在示例中所做的那样在 Connected 回调中发送数据包。
  • 我确实将您的客户端代码复制并粘贴到了我的客户端类中,并将服务器代码复制并粘贴到了服务器类中,但它似乎不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-23
  • 2016-09-22
  • 2011-10-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多