它代表应用程序和 URL 之间的通信链接。此类的实例可用于读取和写入此 URL 引用的资源。通常,创建一个到 URL 的连接需要几个步骤:
openConnection() | connect() |
---|---|
对影响到远程资源连接的参数进行操作。 | 与资源交互;查询头字段和内容。 |
时间
- 通过在 URL 上调用 openConnection方法创建连接对象。
- 处理设置参数和一般请求属性。
- 使用 connect方法建立到远程对象的实际连接。
- 远程对象变为可用。远程对象的头字段和内容变为可访问。
使用以下方法修改设置参数:
-
setAllowUserInteraction
-
setDoInput
-
setDoOutput
-
setIfModifiedSince
-
setUseCaches
使用以下方法修改一般请求属性:
-
setRequestProperty
使用 setDefaultAllowUserInteraction和 setDefaultUseCaches可设置 AllowUserInteraction和 UseCaches参数的默认值。 上面每个 set方法都有一个用于获取参数值或一般请求属性值的对应 get方法。适用的具体参数和一般请求属性取决于协议。 在建立到远程对象的连接后,以下方法用于访问头字段和内容:
-
getContent
-
getHeaderField
-
getInputStream
-
getOutputStream
某些头字段需要经常访问。以下方法:
-
getContentEncoding
-
getContentLength
-
getContentType
-
getDate
-
getExpiration
-
getLastModifed
提供对这些字段的便捷访问。getContent方法使用 getContentType方法以确定远程对象类型;子类重写 getContentType方法很容易。 一般情况下,所有的预连接参数和一般请求属性都可忽略:预连接参数和一般请求属性默认为敏感值。对于此接口的大多数客户端而言,只有两个需要的方法:getInputStream和 getContent,它们通过便捷方法镜像到 URL类中。 有关 http连接的请求属性和头字段的更多信息,可从以下位置找到:
有关 fileNameMap的注意事项:在 JDK 1.1.6 以前的版本中,URLConnection的 fileNameMap字段是公共的。在 JDK 1.1.6 及以后的版本中,fileNameMap字段是私有的;对其添加了 accessor 方法和 mutator 方法 getFileNameMap及 setFileNameMap以便访问。Compatibility 页中也对此更改进行了介绍。 完成请求后,在一个 URLConnection 的 InputStream 或 OutputStream 上调用 close() 方法可以释放与此实例相关的网络资源,除非特定的协议规范为其指定了其他行为。
具体方法和属性查看相关的api文档。它有两个子类HttpURLConnection, JarURLConnection ,它的底层实现就是socket来完成的 ,现在我们来看看子类HttpURLConnection写的一个实例。
public void synchronizeOthersServer() throws BoException {
String[] ips = StringUtil.split(appServers, "|");
// 同步其他服务器的html文件
try {
for (String ip : ips) {
URL url = new URL("http://" + ip + SYCHRONIZED_URL);
HttpURLConnection conn = (HttpURLConnection) url
.openConnection();
conn.setDoOutput(true);
conn.setRequestMethod("POST");
String param = "ipAndport=" + ip;
// conn.setConnectTimeout(CONNECT_TIMEOUT);
// conn.setReadTimeout(READ_TIMEOUT);
conn.connect();
OutputStream out = conn.getOutputStream();
out.write(param.getBytes());
out.flush();
out.close();
if (conn.getResponseCode() >= 400) {
throw new BoException("同步服务器前台左边菜单树html文件异常:" + ip);
}
}
} catch (Exception e) {
throw new BoException("同步服务器文件超时,请稍后再试!");
}
}
用这种方法做同步不是个好方法,但是这的确是一种解决同步的方案。