我已根据previous question中的建议,使用Java Threads和BlockingQueues(生产者和消费者队列)对Client Server应用程序建模。
我所拥有的是服务器有一个BlockingQueue<Request>
,它会将响应推送到客户端BlockingQueue<Response>
。现在的问题是如何设置客户端来调用服务器功能。我有客户run()
while (true) {
Response res = responses.take();
switch (res.function) {
case "getReservationStatus":
TreeMap<Integer, Boolean> reservations = (TreeMap<Integer, Boolean>) res.data;
//System.out.println("getReservationStatus");
for (Entry<Integer, Boolean> reservation : reservations.entrySet()) {
//System.out.println(" - " + reservation.getKey() + " \t " + (reservation.getValue() ? "Booked" : "Available"));
}
break;
case "book":
SimpleEntry<Integer, Boolean> data = (SimpleEntry<Integer, Boolean>) res.data;
System.out.println(terminalId + ": Booking seat " + data.getKey() + " " + (data.getValue() ? "Successful" : "Unsucessful"));
break;
}
}
我如何以某种方式从main()
允许用户控制要发送给客户端的命令?现在我在while
答案 0 :(得分:0)
我不确定我是否理解你的问题,但我会尝试给出答案和一些想法:
如果您希望为您的程序实现用户界面,则必须首先定义用户可以对您的程序执行的操作。一种流行的方法是定义用例,并从中推断出界面。让我们说我们从这些用例中定义功能。很明显,你不再需要这个步骤了,因为你已经完成了应用程序的内核。
您的应用程序是将请求推送到服务器以处理它们并获取响应。这些请求及其参数构成服务器理解的语言。同样,响应是客户可以理解的语言,因此您可以围绕请求语言对UI进行建模。如果该语言足够简单,您可以将其表示为树,这很容易在UI中实现。
您基本上有三种选择:
文字输入UII:它应该是最简单的,
图形化UII(例如,摇摆),
网络用户界面
在所有三种情况下,界面都可以建模为菜单和子菜单列表,以涵盖所有请求的可能性:每个请求都是第一个菜单的条目,然后每个子菜单级别代表所选请求的细化。你可以在这里看到我之前提到过的一棵树的相似之处。对于图形用户界面或网络用户界面(毕竟它也是图形用户界面),这几乎是微不足道的:你会在网上找到大量的教程。对于文本输入,您只需显示编号的项目列表(菜单),并要求用户选择一个选项。
一些注意事项:
您的应用程序现状,模拟多个客户端与一台服务器的交互。我不确定如何在您的UI中拥有它:也许您可以使用一组命令来增强语言以生成和管理客户端,以及指示哪个客户端应该发送哪些请求。
如果您喜欢冒险并选择文本输入,您可以尝试使用真实语言建模来表示您的查询,并为此实现解析器,这也是一个非常广泛的主题,但非常有趣。无论如何,你可能会在以后的学习中进入。
如果输入的请求复杂或繁琐,您可以设计一个模板系统,用户可以在其中创建请求模板,命名,然后再引用它,而不是再次输入相同的请求。看看我们如何在这里接近一种小型编程语言。
java世界中的Web应用程序通常基于相当复杂的框架和工具,您可能希望首先从其他选项开始,以便更好地了解UI。
正如我的评论中提到的,对于图形用户界面,尝试像eclipse或netbeans这样的IDE,它可以让您轻松地以图形方式定义所有内容并将代码挂钩到特定事件(例如按下按钮)。