与URL类相比,URLConnection对与服务器(特别是HTTP服务器)的交互提供了更多的控制。
1)提供了对首部的访问
2)可以配置发送给服务器的请求参数
3)除了读取还可以向服务器写入数据
URLConnection可以检查服务器发送的首部,并相应地做出响应,可以设置客户端请求中使用的首部字段,可以用POST、PUT和其他HTTP请求方法想服务器发回数据。
URLConnection是Java的协议处理器(protocol handler)机制的一部分,这个机制还包括URLStreamHanlder类。协议处理器的思想很简单,将处理协议的细节与处理特定数据类型分开,提供相应的用户接口,并完成完整web浏览器所完成的其他操作。
使用URLConnection类的程序遵循以下基本步骤:
1)构造一个URL对象
2)调用这个URL对象的openConnection获取一个对应该URL的URLConnection对象
3)配置这个URLConnection
4)读取首部字段
5)获取输入流并读取数据
6)获取输出流并写入数据
7)关闭连接
第一次构造URLConnection是未连接的,本地和远程主机无法发送和接受数据。没有socket连接这两个主机。
connect方法在本地和远程主机之间建立一个连接(一般使用TCP socket,但也可能通过其他机制建立),这样就可以收发数据了。
对于getInputSteam、getConnect、getHeaderField和其他要求打开连接的方法,如果连接尚未打开,它们就会调用connect方法。因此,你很少需要直接调用connect方法。
1、读取服务器数据
1)构造一个URL对象
2)调用这个URL对象的openConnection方法,获取对应URL的URLConnection对象
3)调用这个URLConnection的getInputStream方法
4)使用常用的流API读取输入流
2、读取首部
一般来说,HTTP首部可能包括所请求文档的内容类型、文档长度(字节数)、对内容编码所采用的字符集、日期时间、内容的过期时间以及内容的最后修改日期。
3、写入数据
URLConnection在默认情况下不允许输出,所以在请求输出流之前必须调用setDoOutput(true)方法。
HttpURLConnection是URLConnection的子类,提供了额外的方便处理http URL的帮助方法,可以获取和设置请求方法、确定是否重定向、获得响应码和消息、确定是否使用了代理服务器、便于记忆的对应各种HTTP响应码的常量。
HTTP1.1支持持久连接,允许通过一个TCP socket发送多个请求和响应,不过使用Keep-Alive时,服务器不会因为已经向客户端发送了最后一个字节的数据就立即关闭连接,毕竟,客户端有可能还会发送另一个请求,服务器会超时并关闭连接,可能会有5秒处于非活动状态,不过,最好还是由客户端在确认工作结束后关闭连接。
HttpURLConnection默认支持Keep-Alive,在服务器关闭连接之前,如果再次连接同一个服务器,会重用socket,一旦知道与一个特定主机的会话结束,disconnect方法允许客户端断开连接。如果这个连接上还有打开的流,disconnect方法将关闭这些流。不过,反过来不成立,关闭一个持久连接上的流时,并不会关闭这个socket断开连接。
在发送请求时,首部在主体前面,不过要写入首部,需要知道主体的长度,Java的解决方法是获取output stream,缓存其内容,直到流关闭,然后就知道主体有多少字节,然后写入首部的content-length。不过这样在发送第一个字节之前,必须先等待最后一个字节写入,不是很高效。
如果事先知道主体内容大小,可以将长度传递给setFixedLengthStreamingMode,采用流模式。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。