我正在Netty上开发拍卖系统。 我使用Netty是因为谷歌搜索告诉我NIO可以处理比普通套接字编程更大的客户端。
基本上我是Netty的首发。我已经介绍了教程和用户指南。就是这样。 因此,如果我的问题不符合“问题”,请理解。 以下是我客户的伪代码。
public class AuctionClient
{
private boolean loggedIn;
public AuctionClient() //constructor
///
.... // various functions
///
public void run()
{
while (true)
{
int option = getUserOption(); //get user menu selection
switch(option)
{
case 1:
login(); //user enters username and password. The info is converted into JSON string and sent to AuctionServer.
//AuctionServer returns true if the info is correct, false otherwise
break;
case 2:
startAuction(); //start a new auction
break;
case 3:
makeBid(); //make a bid to an existing auction
break;
case 4:
logout(); //log out from the AuctionServer
break;
default:
break;
}
}
}
public static void main() // Creates AuctionClient class and runs it.
}
这是我想要做的事情的要点。 问题是,我只想在变量loggedIn为true时启用startAuction(),makeBid()和logout()。因此,我必须知道登录是否成功才能更改loggedIn的值。
但由于它是AuctionClientHandler(虽然现在显示在这里)处理login()的结果,因此AuctionClient无法知道登录是否成功。
有没有一种优雅的方法来解决这个问题。我想避免使用BlockingQueue在AuctionClient和AuctionClientHandler之间传递信息。或者拍卖系统有更好的设计吗?
任何帮助都将不胜感激。
爱德华
答案 0 :(得分:0)
我认为你的问题可归结为一个简单的事实。您需要保持之前操作的“状态”。因此,每次在PipelineFactory
实施中都需要创建一个新的处理程序。对于例如pipeline.addLast('MyAuctionHandler',new AuctionHandlerClass());
第一次成功登录时,LoginHandler
中的pipeline
应向AuctionClientHandler
发送一条消息,说明一个特殊对象,然后您可以使用该对象设置login
标记为true
。
例如代码,您可能想看看我发布的Java Game Server。它还处理类似的登录,会话管理等。这是处理登录的handler,唯一的区别是这个处理程序不是有状态的,因为我将状态移动到会话LookupService
类。
答案 1 :(得分:0)
另一种方法是将状态存储为频道上的附件。
Channel.setAttachment(..);