- 已知子类:
HttpsServer
HttpServer 绑定到 IP 地址和端口号,并监听来自该地址上的客户端的传入 TCP 连接。子类 HttpsServer 实现了一个处理 HTTPS 请求的服务。
一个或多个 HttpHandler 对象必须与服务相关联才能处理请求。每个这样的 HttpHandler 都注册了一个根 URI 路径,该路径表示应用程序或服务在此服务上的位置。处理程序到 HttpServer 的映射由 HttpContext 对象封装。 HttpContext 是通过调用 createContext(String,HttpHandler) 创建的。找不到处理程序的任何请求都会被拒绝并返回 404 响应。通过提供 Executor 对象,可以在该对象外部完成线程管理。如果没有提供,则使用默认实现。
当接收到 HTTP 请求时,通过查找其路径是请求 URI 路径的最长匹配前缀的上下文来定位适当的HttpContext(和处理程序)。路径按字面匹配,这意味着字符串比较区分大小写,并且不与任何编码形式进行转换。例如,给定一个配置了以下 HttpContexts 的 HttpServer:
| Context | 上下文路径 |
|---|---|
| ctx1 | "/" |
| ctx2 | "/apps/" |
| ctx3 | "/apps/foo/" |
下表显示了一些请求 URI 以及它们将匹配的上下文(如果有的话):
| 请求 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
-
构造方法总结
构造方法 -
方法总结
修饰符和类型方法描述abstract voidbind(InetSocketAddress addr, int backlog) 将当前未绑定的HttpServer绑定到给定的地址和端口号。static HttpServercreate()创建一个最初未绑定到任何本地地址/端口的HttpServer实例。static HttpServercreate(InetSocketAddress addr, int backlog) 创建一个HttpServer实例,它将绑定到指定的InetSocketAddress(IP 地址和端口号)。static HttpServercreate(InetSocketAddress addr, int backlog, String path, HttpHandler handler, Filter... filters) 创建一个带有初始上下文的HttpServer实例。abstract HttpContextcreateContext(String path) 创建 HttpContext 而不最初指定处理程序。abstract HttpContextcreateContext(String path, HttpHandler handler) 创建一个HttpContext。abstract InetSocketAddress返回此服务正在监听的地址abstract Executorabstract voidremoveContext(HttpContext context) 从服务中删除给定的上下文。abstract voidremoveContext(String path) 从服务中删除由给定路径标识的上下文。abstract voidsetExecutor(Executor executor) 设置此服务的Executor对象。abstract voidstart()在新的后台线程中启动此服务。abstract voidstop(int delay) 通过关闭监听套接字并禁止处理任何新的交换来停止此服务。
-
构造方法详细信息
-
HttpServer
protected HttpServer()子类调用的构造方法。
-
-
方法详情
-
create
创建一个最初未绑定到任何本地地址/端口的HttpServer实例。HttpServer是从当前安装的HttpServerProvider获取的。服务必须使用bind(InetSocketAddress,int)绑定后才能使用。- 返回:
HttpServer的实例- 抛出:
IOException- 如果发生 I/O 错误
-
create
创建一个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- 上下文的 HttpHandlerfilters- 上下文过滤器,可选- 返回:
- HTTP服务
- 抛出:
BindException- 如果服务无法绑定到地址IOException- 如果发生 I/O 错误IllegalArgumentException- 如果路径无效NullPointerException- 如果以下任何一项:path、handler、filters或filters的任何元素是null- 自从:
- 18
-
bind
将当前未绑定的HttpServer绑定到给定的地址和端口号。还可以指定最大积压。这是监听套接字上允许的最大排队传入连接数。排队的 TCP 连接超过此限制可能会被 TCP 实现拒绝。- 参数:
addr- 要收听的地址backlog- 套接字积压。如果此值小于或等于零,则使用系统默认值- 抛出:
BindException- 如果服务无法绑定到请求的地址或者服务已经绑定NullPointerException- 如果地址是nullIOException
-
start
public abstract void start()在新的后台线程中启动此服务。后台线程继承调用者的优先级、线程组和上下文类加载器。 -
setExecutor
设置此服务的Executor对象。在调用start()之前必须建立Executor。所有 HTTP 请求都在交给执行者的任务中处理。如果未调用此方法(在start()之前)或者如果使用null Executor调用它,则使用默认实现,它使用由start()方法创建的线程。- 参数:
executor- 要设置的Executor,或用于默认实现的null- 抛出:
IllegalStateException- 如果服务已经启动
-
getExecutor
- 返回:
-
为该服务建立的
Executor或null(如果未设置)。
-
stop
public abstract void stop(int delay) 通过关闭监听套接字并禁止处理任何新的交换来停止此服务。然后该方法将阻塞,直到所有当前交换处理程序都已完成,或者大约在延迟秒已经过去(以先发生者为准)。然后,关闭所有打开的 TCP 连接,start()创建的后台线程退出,方法返回。一旦停止,HttpServer就不能再使用。- 参数:
delay- 等待交换完成的最长时间(以秒为单位)- 抛出:
IllegalArgumentException- 如果延迟小于零
-
createContext
创建一个HttpContext。HttpContext表示从 URI 路径到此HttpServer上的交换处理程序的映射。创建后,服务收到的所有路径请求都将通过调用给定的处理程序对象来处理。上下文由路径标识,稍后可以使用removeContext(String)方法从服务中删除。该路径指定此上下文的根 URI 路径。路径的第一个字符必须是'/'。
类概述描述了传入请求 URI 如何 映射 到 HttpContext 实例。
- API 注意:
-
路径通常应该(但不是必须)以“/”结尾。如果路径不以“/”结尾,例如以
"/foo"那么这将匹配具有"/foobar"或"/foo/bar"路径的请求。 - 参数:
path- 与上下文关联的根 URI 路径handler- 为传入请求调用的处理程序- 返回:
HttpContext的实例- 抛出:
IllegalArgumentException- 如果路径无效,或者该路径的上下文已经存在NullPointerException- 如果路径或处理程序是null
-
createContext
创建 HttpContext 而不最初指定处理程序。稍后必须使用HttpContext.setHandler(HttpHandler)指定处理程序。HttpContext表示从 URI 路径到此HttpServer上的交换处理程序的映射。一旦创建并设置了处理程序,服务收到的所有路径请求都将通过调用处理程序对象来处理。上下文由路径标识,稍后可以使用removeContext(String)方法从服务中删除。该路径指定此上下文的根 URI 路径。路径的第一个字符必须是'/'。
类概述描述了传入请求 URI 是如何从 映射 到
HttpContext实例的。- API 注意:
-
路径通常应该(但不是必须)以“/”结尾。如果路径不以“/”结尾,例如以
"/foo"那么这将匹配具有"/foobar"或"/foo/bar"路径的请求。 - 参数:
path- 与上下文关联的根 URI 路径- 返回:
HttpContext的实例- 抛出:
IllegalArgumentException- 如果路径无效,或者该路径的上下文已经存在NullPointerException- 如果路径是null
-
removeContext
从服务中删除由给定路径标识的上下文。删除上下文不会影响当前正在处理的交换,但会阻止接受新的交换。- 参数:
path- 要删除的处理程序的路径- 抛出:
IllegalArgumentException- 如果不存在对应于此路径的处理程序。NullPointerException- 如果路径是null
-
removeContext
从服务中删除给定的上下文。删除上下文不会影响当前正在处理的交换,但会阻止接受新的交换。- 参数:
context- 要删除的上下文- 抛出:
NullPointerException- 如果上下文是null
-
getAddress
返回此服务正在监听的地址- 返回:
InetSocketAddress服务正在监听
-