类 HttpServer

java.lang.Object
com.sun.net.httpserver.HttpServer
已知子类:
HttpsServer

public abstract class HttpServer extends Object
此类实现了一个简单的 HTTP 服务。 HttpServer 绑定到 IP 地址和端口号,并监听来自该地址上的客户端的传入 TCP 连接。子类 HttpsServer 实现了一个处理 HTTPS 请求的服务。

一个或多个 HttpHandler 对象必须与服务相关联才能处理请求。每个这样的 HttpHandler 都注册了一个根 URI 路径,该路径表示应用程序或服务在此服务上的位置。处理程序到 HttpServer 的映射由 HttpContext 对象封装。 HttpContext 是通过调用 createContext(String,HttpHandler) 创建的。找不到处理程序的任何请求都会被拒绝并返回 404 响应。通过提供 Executor 对象,可以在该对象外部完成线程管理。如果没有提供,则使用默认实现。

将请求 URI 映射到 HttpContext 路径

当接收到 HTTP 请求时,通过查找其路径是请求 URI 路径的最长匹配前缀的上下文来定位适当的HttpContext(和处理程序)。路径按字面匹配,这意味着字符串比较区分大小写,并且不与任何编码形式进行转换。例如,给定一个配置了以下 HttpContexts 的 HttpServer

description
Context 上下文路径
ctx1 "/"
ctx2 "/apps/"
ctx3 "/apps/foo/"

下表显示了一些请求 URI 以及它们将匹配的上下文(如果有的话):

description
请求 URI 匹配上下文
“http://foo.com/apps/foo/bar” ctx3
“http://foo.com/apps/Foo/bar” 不匹配,大小写错误
“http://foo.com/apps/app1” ctx2
“http://foo.com/foo” ctx1

关于套接字积压的注意事项

绑定到地址和端口号时,应用程序还可以指定一个整数积压范围。这表示系统将在内部排队的传入 TCP 连接的最大数量。连接在等待被 HttpServer 接受时排队。当达到限制时,底层 TCP 实现可能会拒绝(或可能忽略)进一步的连接。设置正确的 backlog 值是 TCP 层中高效资源使用(不要设置得太高)和允许足够的传入请求吞吐量(不要设置得太低)之间的折衷。

自从:
1.6
  • 构造方法详细信息

    • HttpServer

      protected HttpServer()
      子类调用的构造方法。
  • 方法详情

    • create

      public static HttpServer  create() throws IOException
      创建一个最初未绑定到任何本地地址/端口的HttpServer实例。 HttpServer 是从当前安装的 HttpServerProvider 获取的。服务必须使用bind(InetSocketAddress,int) 绑定后才能使用。
      返回:
      HttpServer 的实例
      抛出:
      IOException - 如果发生 I/O 错误
    • create

      public static HttpServer  create(InetSocketAddress  addr, int backlog) throws IOException
      创建一个 HttpServer 实例,它将绑定到指定的 InetSocketAddress (IP 地址和端口号)。还可以指定最大积压。这是监听套接字上允许的最大排队传入连接数。排队的 TCP 连接超过此限制可能会被 TCP 实现拒绝。 HttpServer 是从当前安装的 HttpServerProvider 获取的
      参数:
      addr - 要监听的地址,如果是 null 则必须调用 bind(InetSocketAddress, int) 来设置地址
      backlog - 套接字积压。如果此值小于或等于零,则使用系统默认值
      返回:
      HttpServer 的实例
      抛出:
      IOException - 如果发生 I/O 错误
      BindException - 如果服务无法绑定到请求的地址,或者服务已经绑定
    • create

      public static HttpServer  create(InetSocketAddress  addr, int backlog, String  path, HttpHandler  handler, Filter ... filters) throws IOException
      创建一个带有初始上下文的 HttpServer 实例。

      服务是用一个创建的初始上下文将 URI path 映射到交换 handler 。初始上下文是通过调用 createContext(path) 创建的。 filters(如果有的话)按照给定的顺序添加到初始上下文中。返回的服务未启动,因此可以根据需要进一步配置。

      服务实例将绑定到给定的 InetSocketAddress

      还可以指定最大积压。这是监听套接字上允许的最大排队传入连接数。排队的 TCP 连接超过此限制可能会被 TCP 实现拒绝。 HttpServer 是从当前安装的 HttpServerProvider 获取的。

      参数:
      addr - 要监听的地址,如果是 null 则必须调用 bind 来设置地址
      backlog - 套接字积压。如果此值小于或等于零,则使用系统默认值
      path - 上下文的根 URI 路径,必须是绝对的
      handler - 上下文的 HttpHandler
      filters - 上下文过滤器,可选
      返回:
      HTTP服务
      抛出:
      BindException - 如果服务无法绑定到地址
      IOException - 如果发生 I/O 错误
      IllegalArgumentException - 如果路径无效
      NullPointerException - 如果以下任何一项:pathhandlerfiltersfilters 的任何元素是 null
      自从:
      18
    • bind

      public abstract void bind(InetSocketAddress  addr, int backlog) throws IOException
      将当前未绑定的 HttpServer 绑定到给定的地址和端口号。还可以指定最大积压。这是监听套接字上允许的最大排队传入连接数。排队的 TCP 连接超过此限制可能会被 TCP 实现拒绝。
      参数:
      addr - 要收听的地址
      backlog - 套接字积压。如果此值小于或等于零,则使用系统默认值
      抛出:
      BindException - 如果服务无法绑定到请求的地址或者服务已经绑定
      NullPointerException - 如果地址是 null
      IOException
    • start

      public abstract void start()
      在新的后台线程中启动此服务。后台线程继承调用者的优先级、线程组和上下文类加载器。
    • setExecutor

      public abstract void setExecutor(Executor  executor)
      设置此服务的 Executor 对象。在调用 start() 之前必须建立 Executor。所有 HTTP 请求都在交给执行者的任务中处理。如果未调用此方法(在 start() 之前)或者如果使用 null Executor 调用它,则使用默认实现,它使用由 start() 方法创建的线程。
      参数:
      executor - 要设置的 Executor,或用于默认实现的 null
      抛出:
      IllegalStateException - 如果服务已经启动
    • getExecutor

      public abstract Executor  getExecutor()
      如果使用 setExecutor(Executor) 指定,则返回此服务的 Executor 对象,如果未指定,则返回 null
      返回:
      为该服务建立的 Executornull(如果未设置)。
    • stop

      public abstract void stop(int delay)
      通过关闭监听套接字并禁止处理任何新的交换来停止此服务。然后该方法将阻塞,直到所有当前交换处理程序都已完成,或者大约在延迟秒已经过去(以先发生者为准)。然后,关闭所有打开的 TCP 连接,start() 创建的后台线程退出,方法返回。一旦停止,HttpServer 就不能再使用。
      参数:
      delay - 等待交换完成的最长时间(以秒为单位)
      抛出:
      IllegalArgumentException - 如果延迟小于零
    • createContext

      public abstract HttpContext  createContext(String  path, HttpHandler  handler)
      创建一个 HttpContextHttpContext 表示从 URI 路径到此 HttpServer 上的交换处理程序的映射。创建后,服务收到的所有路径请求都将通过调用给定的处理程序对象来处理。上下文由路径标识,稍后可以使用 removeContext(String) 方法从服务中删除。

      该路径指定此上下文的根 URI 路径。路径的第一个字符必须是'/'。

      类概述描述了传入请求 URI 如何 映射 到 HttpContext 实例。

      API 注意:
      路径通常应该(但不是必须)以“/”结尾。如果路径不以“/”结尾,例如以 "/foo" 那么这将匹配具有 "/foobar""/foo/bar" 路径的请求。
      参数:
      path - 与上下文关联的根 URI 路径
      handler - 为传入请求调用的处理程序
      返回:
      HttpContext 的实例
      抛出:
      IllegalArgumentException - 如果路径无效,或者该路径的上下文已经存在
      NullPointerException - 如果路径或处理程序是 null
    • createContext

      public abstract HttpContext  createContext(String  path)
      创建 HttpContext 而不最初指定处理程序。稍后必须使用 HttpContext.setHandler(HttpHandler) 指定处理程序。 HttpContext 表示从 URI 路径到此 HttpServer 上的交换处理程序的映射。一旦创建并设置了处理程序,服务收到的所有路径请求都将通过调用处理程序对象来处理。上下文由路径标识,稍后可以使用 removeContext(String) 方法从服务中删除。

      该路径指定此上下文的根 URI 路径。路径的第一个字符必须是'/'。

      类概述描述了传入请求 URI 是如何从 映射HttpContext 实例的。

      API 注意:
      路径通常应该(但不是必须)以“/”结尾。如果路径不以“/”结尾,例如以 "/foo" 那么这将匹配具有 "/foobar""/foo/bar" 路径的请求。
      参数:
      path - 与上下文关联的根 URI 路径
      返回:
      HttpContext 的实例
      抛出:
      IllegalArgumentException - 如果路径无效,或者该路径的上下文已经存在
      NullPointerException - 如果路径是 null
    • removeContext

      public abstract void removeContext(String  path) throws IllegalArgumentException
      从服务中删除由给定路径标识的上下文。删除上下文不会影响当前正在处理的交换,但会阻止接受新的交换。
      参数:
      path - 要删除的处理程序的路径
      抛出:
      IllegalArgumentException - 如果不存在对应于此路径的处理程序。
      NullPointerException - 如果路径是 null
    • removeContext

      public abstract void removeContext(HttpContext  context)
      从服务中删除给定的上下文。删除上下文不会影响当前正在处理的交换,但会阻止接受新的交换。
      参数:
      context - 要删除的上下文
      抛出:
      NullPointerException - 如果上下文是 null
    • getAddress

      public abstract InetSocketAddress  getAddress()
      返回此服务正在监听的地址
      返回:
      InetSocketAddress 服务正在监听