Netty的基本身份验证器

时间:2016-05-12 14:28:45

标签: java authentication netty packet

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

我发现了Netty,我认为将它用于我的网络系统会更好。 我实际上创建了一个客户端和服务器处理程序(都扩展了ChannelInboundHandlerAdapter)来从ByteBuf序列化和反序列化我的数据包,它的工作很精细:)!

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

实际算法

  • 客户方:
    1. 用户启动客户端新窗口要求他输入用户名和密码当他点击“登录”时,客户端连接到服务器,并在发送LoginPacket后。
    2. 如果authServerPacket由auth标志为true的服务器发送,他继续并打开所有其他功能。
    3. 如果服务器将authServerPacket的auth标志设置为false,则会显示弹出窗口,并重新打开窗口登录。
  • 服务器端:
    1. 当用户连接到服务器时,它是连接到客户端的LoginHandler。
    2. 在这个LoginHandler中,只处理了LoginPacket,因此,当它接收到LoginPacket时,会检查数据库中的信息,如果这些信息是正确的,则将客户端添加到ServerHandler并从LoginHandler中删除,现在他可以接收并发送所有其他数据包。
    3. ServerHandler将带有auth标志的AuthServerPacket发送给true。

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

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

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

提前感谢您的回答。
以编程方式,beaucoralk。

2 个答案:

答案 0 :(得分:2)

我们今天在IRC #netty上谈过:)

我的建议是:

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

基本上,在成功进行身份验证后,您的LoginHandler会自行删除。重要提示:在删除处理程序之前添加 new 处理程序。 :)

最好的问候

答案 1 :(得分:2)

我用这个解决了我的问题:

  • 在我的Pipeline Initialize中总是添加LoginHandler(不要添加我的ServerHandler)
  • 登录成功后,LoginHandler会执行: ctx.pipeline.addLast(new GameLogicServerHandler()); ctx.pipeline.remove(this);

事实上我没有像Franz Bettag那样成功使用addAfter,没有合适的方法。

但是感谢Bettag帮助我理解#netty IRC上的许多内容。