实际上,对于我的服务器游戏,我没有使用Netty。我为发送数据包对象创建了一个套接字多线程系统,该对象被序列化为(Int和Out)StreamBuffer并从中反序列化。

我发现了Netty,我认为最好将其用于我的网络系统。
我实际上已经创建了一个客户端和服务器处理程序(都扩展了ChannelInboundHandlerAdapter)以对来自ByteBuf的数据包进行序列化和反序列化,这很不错:)!

现在,我想迁移身份验证系统。
实际上,我有两个处理程序,分别可以接收和处理登录数据包(在发送缓冲区数据包时由id定义)的LoginHandler和可以接收和处理所有其他数据包的ServerHandler。

实际算法


客户端 :


用户在新窗口中启动客户端,要求他输入用户名和密码。单击“登录”时,客户端连接到服务器,并发送一个LoginPacket。
如果服务器发送的AuthServerPacket的auth标志为true,则他继续并打开所有其他功能。
如果服务器发送的AuthServerPacket的auth标志为false,则会显示带有原因的弹出窗口,然后重新打开窗口登录名。

服务器端 :


当用户连接到服务器时,是登录到客户端的LoginHandler。
在此LoginHandler中,仅处理LoginPacket,因此,当它收到LoginPacket时,它将检查数据库中的信息,如果这些信息正确,则将客户端添加到ServerHandler并从LoginHandler中删除,现在他可以接收和发送所有信息。其他数据包。
ServerHandler发送auth标志为true的AuthServerPacket。



我的问题是,用Netty重新创建此系统的最佳方法是什么?

我不知道是否可以在管道中添加登录处理程序,如果通道已通过身份验证,则不会对其进行检查。如果其中一个处理程序拒绝该通道,我不知道如何停止进程或是否停止该进程。

有人可以帮助我了解用Netty做我想要的最好的方法是什么?

预先感谢您的回答。
通过编程,beaucoralk。

最佳答案

我们今天在IRC #netty上聊天:)

我的建议是:


在管道初始化程序中,始终添加LoginHandler
登录成功后,LoginHandler应:
ctx.pipeline.addAfter(this, "gameHandler", new GameLogicHandler());ctx.pipeline.remove(this);


因此,基本上,您的LoginHandler在成功通过身份验证后便会自行删除。重要信息:在删除旧的Handler之前,添加新的Handler。 :)

最好的祝福

07-24 15:44