0

我已经按照上一个问题中的建议使用 Java 线程和 BlockingQueues(生产者和消费者队列)对客户端服务器应用程序进行了建模。

我所拥有的是服务器有一个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

4

1 回答 1

0

我不确定我是否理解您的问题,但我会尝试给出答案和一些想法:

如果你想为你的程序实现一个用户界面,你必须首先定义你的用户可以用你的程序做什么。一种流行的方法是定义用例,并从中推断出接口。让我们说,我们从这些用例中定义功能。很明显,您不再需要该步骤,因为您已经完成了应用程序的内核。

您的应用程序是关于将请求推送到服务器以对其进行处理并获得响应。这些请求及其参数构成了服务器可以理解的语言。同样,响应是客户可以理解的语言,因此您可以围绕请求语言对 UI 建模。如果该语言足够简单,您可以将其表示为一棵树,这很容易在 UI 中实现。

你基本上有三个选择:

  • 文本输入 UII:它应该是最简单的,

  • 图形UII(例如swing),

  • 网页界面

在所有这三种情况下,界面都可以建模为菜单和子菜单列表,以涵盖请求的所有可能性:每个请求都是您的第一个菜单的条目,然后每个子菜单级别代表所选请求的细化。您可以在这里看到与我之前暗示的一棵树的相似之处。对于图形用户界面或网络用户界面(毕竟它也是图形用户界面),这几乎是微不足道的:你会在网络上找到大量的教程。对于文本输入,您可以只显示一个编号的项目列表(菜单),并要求用户选择一个选项。

一些注意事项:

就目前而言,您的应用程序模拟了多个客户端与一台服务器的交互。我不确定如何在 UI 中使用它:也许您可以使用一组命令来增强语言以生成和管理客户端,以及指示哪个客户端应该发送哪些请求。

如果您喜欢冒险并选择了文本输入,您可以尝试建模一种真实的语言来表示您的查询,并为此实现一个解析器,这也是一个非常广泛的主题,但非常有趣。无论如何,您可能会在以后的学习中涉及到这一点。

如果请求很复杂或输入繁琐,您可以设计一个模板系统,用户可以在其中创建一个请求模板,命名它,然后稍后引用它,而不是再次输入相同的请求。在这里了解我们如何接近一种小型编程语言。

Java 世界中的 Web 应用程序通常基于相当复杂的框架和工具,您可能希望首先从其他选项开始,以了解 UI。

正如我在评论中提到的,对于图形 UI,请尝试使用 Eclipse 或 netbeans 之类的 IDE,它可以让您轻松地以图形方式定义所有内容并将代码挂钩到特定事件(如按下按钮)。

于 2013-03-01T15:43:00.040 回答