-1

我们需要设计一个服务器,它可以为多个客户端提供网页服务,同时也可以为这些客户端查询远程数据库。该项目的要求之一是整个系统必须符合 REST 架构风格。我们需要使用 Java 作为编程语言,但是在我们设计它时出现了许多问题。

我们希望有一个获取连接的主线程,如下例所示:

// System.out.println("Starting a new web server using port " + port)

    try {
        ServerSocket reciever = new ServerSocket(port);
        while (true) {
            try {
                Socket s = reciever.accept();
                Client c = new Client(s);       
            } catch (IOException e) {
                System.err.println("New item creation failed.");
                IOUtil.close(reciever);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    } catch (IOException e) {
        System.err.println("ServerSocket problem.");
    }

然后每个连接将被创建为一个新线程(代码中的客户端对象),它将负责读取一个请求。如果请求是 GET,那么线程会将资源提供给客户端。如果是 POST,那么它会将请求添加到缓冲区,并让另一个线程处理对数据库的查询,并将答案返回给客户端。处理完这个唯一的请求后,线程关闭套接字并终止。

使用套接字是否违反了 REST 原则?为了尊重 REST 架构,我们是否需要在每个 HTTP 消息之后销毁每个 Client 对象(线程和套接字)?是否有另一种不使用套接字的客户端-服务器通信方式?

4

2 回答 2

2

好的,我认为您将一整袋垃圾混为一谈。

首先,允许数据从 A 传输到 B 的低级 IP 套接字和使用 HTTP 引导从客户端到服务器的连接的“websockets”之间存在差异,该连接可以保持打开状态以进行双向通信。

根据您的要求,您只需要一个“标准”JEE 容器。使用 JAX-RS 之类的东西,您可以将一些基本注释应用于函数,例如@PATH('/MyResource/Cars/')并为该路径调用该函数。

使用容器将使您摆脱所有无聊的样板垃圾。无需手动设置线程来监听,并产生其他线程来处理请求。

使用 IP 套接字(间接地)是 REST 的一项任务;REST 必须(根据 Fielding,但严格来说它与协议无关)必须通过 HTTP,因此必须通过 TCP/IP 套接字(尽管显然您可以通过任何其他传输协议执行 HTTP)。然而,Websockets 使用 HTTP 来形成持久的有状态客户端和服务器之间的连接,这从根本上与 REST 相对。基本 HTTP 将(并且您将通过容器为您执行此操作)完全打开和关闭每个隔离请求的连接,但实际上 HTTP(以及 REST)将允许低级别连接(即 TCP 连接)启动慢)要维护一系列请求。此功能适用于加载 HTML 页面以及一个 TCP 连接中的所有资源,但通过多个 HTTP 请求。

于 2013-12-21T22:47:12.657 回答
1

套接字通过 TCP/IP 移动字节。这是一个较低级别的协议,您不必担心。您关心更高的协议(在这种情况下是 HTTP)。

每次请求后,套接字都会在 HTTP 中关闭,因此您的想法听起来很合理。虽然我不确定你为什么要为 POST 请求创建一个单独的线程。我假设您的Client实现已经在自己的线程中运行(如果没有,那么您的服务器效率不是很高)。

于 2013-12-15T12:39:42.603 回答