网络编程(2)——连接父类URLConnection

在前面网络编程(1)中我们了解到如果想要访问其他主机的资源,那么就得知道该资源的URL。那么如果知道了该URL,我们该怎样去访问其主机上的资源呢?本文主要讲清楚Java语言编程的Android网络编程的最基础的父类URLConnectiion,该类是利用URL来实现主机资源的访问,其每个子类的特点都进一步优化并支持新的网络协议,达到从全面到局部,从广泛到精细的系统学习。

从JavaAPI中可以看到

java.lang.Object

java.net.URLConnection

URLConnection是网络连接类的超类,它代表应用程序和 URL 之间的通信链接。
其直接子类是:HttpURLConnection, JarURLConnection
HttpURLConnection 是支持HTTP特定功能的URLConnection。这个类是我们是我们最常用的一个网络资源访问类。
还有JarConnection是可用来连接Java文档或者Jar文件的类。
此类的实例可用于读取和写入此 URL 引用的资源。
通常,我们要连接到其他主机的资源需要几个步骤: 

1)在 URL 上调用openConnection方法创建连接对象。

<strong>URLConnection conn = url.openConnection();</strong>
注意:构造一个到指定 URL 的 URL 连接,不会创建到 URL 所引用的对象的连接。 也就是说单独只是两端逻辑管道的接通,但没有读写的支持。

2)设置参数和一般请求属性。

比如说我们连接到远程主机之后,我们需要设置一些读取限制等等。比如允不允许资源被读取,要不要使用缓存等等。
一般使用以下方法修改设置参数: setAllowUserInteraction(boolean allowuserinteraction)

允许是否允许用户交互,比如访问后台后启动验证对话框

setDoInput(boolean doinput)

设置输入流,即URL 连接可用于输入和/或输出。将doInput标志设置为true,指示应用程序要从 URL 连接读取数据。默认为ture


setOutInput(boolean dooutput)
设置输出流,即URL 连接可用于输入和/或输出。将doOutput标志设置为true,指示应用程序要将数据写入 URL 连接。默认为flase
setUseCaches(boolean usecaches)
设置是否使用缓存
   
setConnectTimeout(int timeout)
设置连接超时时间,以毫秒为单位设置一个指定的超时值(以毫秒为单位),该值将在打开到此 URLConnection 引用的资源的通信链接时使用。如果在建立连接之前超时期满,则会引发一个 java.net.SocketTimeoutException。超时时间为零表示无穷大超时。

setReadTimeout(int timeout)

设置读取超时时间,以毫秒为单位。

setContentHandlerFactory(ContentHandlerFactory fac)

设置应用程序的ContentHandlerFactory.一个应用程序最多只能调用一次该方法。ContentHandlerFactory实例用于根据内容类型构造内容处理程序。 

使用以下方法设置请求属性:
setRequestProperty(String key,String value)
设置请求属性。(很常用的方法)

3)使用
connect 方法建立到远程对象的实际连接。

<span style="font-size:14px;"><span style="font-family:SimHei;"><span style="font-weight: normal;">Conn.connect();</span>
</span></span>

注意:URLConnection 对象经历两个阶段:首先创建对象,然后建立连接。步骤(1)只是连接阶段。在(1)和(3)步骤之间可以设置以上参数和属性。

4)操作对应的资源。

在连接后才能进行的操作,此时远程对象变为可用。远程对象的头字段和内容变为可访问。
头字段可以理解为是客户端请求报文和服务端响应报文的配置信息文件,针对内容进行说明和限制的
内容则是客户端和服务端的交互信息主体。

常见的6个头字段访问方法:
public int getContentLength()
返回 content-length头字段的值。 
返回说明:此连接的 URL 引用的资源的内容长度,或者如果内容长度未知,则返回 -1。

public String getContentType()
返回 content-type头字段的值。 
返回说明:该 URL 引用的资源的内容类型,或者如果类型为未知,则返回 null。

public String getContentEncoding()
返回 content-encoding头字段的值。 
返回说明:该 URL 引用的资源的内容编码,或者如果编码为未知,则返回 null。

public long getExpiration()
返回 expires头字段的值。 
返回说明:此 URL 引用的资源的期满日期,或者如果为未知,则返回 0。该值为距离格林威治标准时间 1970 年 1 月 1 日的毫秒数

public long getDate()
返回 date头字段的值。 
返回说明:该 URL 引用的资源的发送日期,或者如果为未知,则返回 0。返回的值为距离格林威治标准时间 1970 年 1 月 1 日的毫秒数。

public long getLastModified()
返回 last-modified头字段的值。结果为距离格林威治标准时间 1970 年 1 月 1 日的毫秒数。 
返回说明:此 URLConnection引用的资源的上次修改日期,或者如果为未知,则返回 0。
public String getHeaderField(String name)(这个方法属于万金油方法,用于获取对应的头字段值,以键值的形式进行)
返回指定的头字段的值。 
如果调用的连接多次使用不同的值设置了头字段,则只返回最后一次设置的值。 
参数 name- 头字段的名称。 
返回说明:指定的头字段的值,或者如果头中没有这样一个字段,则返回 null。

public Map<String,List<String>> getHeaderFields()
返回 头字段的不可修改的 Map。Map 键是表示 response-header 字段名称的 String。每个 Map 值为一个不可修改的 String 的列表,它们代表相应的字段值。 
返回说明:头字段的 Map
API还有更多关于获取头字段的方法,如果有需要可以在博文开头下载API参考。

常见访问内容方法:
public Object getContent() throws IOException
用于获取此 URL 连接的内容。 
此方法首先通过调用getContentType方法确定对象的内容类型。如果这是该应用程序第一次遇到的特定内容类型,则会创建适用于该类型的内容处理程序: 
如果该应用程序已使用setContentHandlerFactory方法建立了内容处理程序工厂实例,则调用此实例的creatContentHandler方法,内容类型为其中的一个参数;结果为该内容类型的内容处理程序。 如果尚未建立任何内容处理程序工厂,或者如果工厂的 
creatContentHandler方法返回 null,则应用程序会加载以下名称的类: sun.net.www.content.<contentType>其中,<contentType> 取自 content-type 字符串,将所有的斜杠字符用句点 (‘.‘)替换,所有其他非字母数字字符用下划线 ‘_‘替换。字母数字字符特指 26 个大写 ASCII 字母 ‘A‘ 到 ‘Z‘,26 个小写 ASCII 字母 ‘a‘ 到 ‘z‘以及 10 个 ASCII 数字 ‘0‘ 到 ‘9‘。如果指定的类不存在,或者不是 ContentHandler 的子类,则抛出一个 UnknownServiceException。
返回说明:获取的对象。应使用instanceof运算符来确定返回的对象的具体类型。

public Object getContent(Class[] classes)throws IOException
获取此 URL 连接的内容。 
参数:Class[]- 指示请求的类型的 Class 数组 
返回说明:获取的第一个与类数组中指定的类型相匹配的对象。如果请求的类型都不支持,则返回 null。应使用 instanceof 运算符来确定返回的对象的具体类型。 

public InputStream getInputStream() throws IOException
返回从此打开的连接读取的输入流。 在读取返回的输入流时,如果在数据可供读取之前达到读入超时时间,则会抛出 SocketTimeoutException。 
返回说明:从此打开的连接读入的输入流。 

public OutputStream getOutputStream() throws IOException
返回写入到此连接的输出流。 
返回说明:写入到此连接的输出流。 

这个类比较重要,虽然后期开发android使用的是它的HTTP子类,可是对于加深被高度分装的子类的理解来说,这个类的掌握是必须的。
时间: 2024-12-08 20:11:58

网络编程(2)——连接父类URLConnection的相关文章

Java网络编程(URL与URLConnection)

//URL package org.urldemo; import java.io.InputStream; import java.net.URL; import java.util.Scanner; public class URLDemo { public static void main(String[] args) throws Exception{ URL url = new URL("http","www.hut.edu.cn",80,"/c

java网络编程长连接的问题

一. 网络程序运行过程中的常见异常及处理 第1个异常是 java.net.BindException:Address already in use: JVM_Bind. 该异常发生在服务器端进行new ServerSocket(port)(port是一个0,65536的整型值)操作时.异常的原因是以为与port一样的一个端口已经被启动,并进行监 听.此时用netstat –an命令,可以看到一个Listending状态的端口.只需要找一个没有被占用的端口就能解决这个问题. 第2个异常是java.

网络编程-http连接-GET&amp;POST

GetRequest package com.net.http; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; i

网络编程-TCP连接-length

在使用readLine方式时,常常会遇到因为没有结束标记,而导致阻塞现象. 如果不想使用结束标记,这里可以使用一个固定长度的byte[],来获取流. server package com.net.tcp.length; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintStream; import java.net.Ser

网络编程-TCP连接-readLine

Server: package com.net.tcp; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintStream; import java.net.ServerSocket; import java.net.Socket; public class MyServer { public static void mai

ACE网络编程

ACE: Adaptive Communication Environment 自适应通信环境,属于主机基础设施中间件SAP:服务点访问ACE模拟提供了所以C++标准库的类下载地址:http://ace.ece.uci.edu/ 或 http://www.riverace.com1.网络通信的设计空间:1).通信空间:交互规则.形式2).并发空间:并发控制.同步3).服务空间:持续时间.结构4).配置空间:网络服务识别.绑定 2.面向对象中间件体系结构的层次1).主机基础设施中间件:对OS并发机

网络编程懒人入门(六):史上最通俗的集线器、交换机、路由器功能原理入门

1.前言 即时通讯网整理了大量的网络编程类基础文章和资料,包括<TCP/IP协议 卷1>.<[通俗易懂]深入理解TCP协议>系列.<网络编程懒人入门>系列.<不为人知的网络编程>系列.<P2P技术详解>系列.<高性能网络编程>系列.甚至还有图文并貌+实战代码的<NIO框架入门>等,目的是帮助即时通讯类应用的开发者,至少要掌握网络编程最基本的原理,所谓知其然更要知其所以然.尤其现在移动网络大行其道的时代,在网络环境如此复杂的

网络编程懒人入门(九):通俗讲解,有了IP地址,为何还要用MAC地址?

1.前言 标题虽然是为了解释有了 IP 地址,为什么还要用 MAC 地址,但是本文的重点在于理解为什么要有 IP 这样的东西.本文对读者的定位是知道 MAC 地址是什么,IP 地址是什么. (本文同步发布于:http://www.52im.net/thread-2067-1-1.html) 2.关于作者 翟志军,个人博客地址:https://showme.codes/,Github:https://github.com/zacker330.感谢作者的原创分享. 作者的另一篇<即时通讯安全篇(七)

网络编程 --- URLConnection --- 读取服务器的数据 --- java

使用URLConnection类获取服务器的数据 抽象类URLConnection表示一个指向指定URL资源的活动连接,它是java协议处理器机制的一部分. URL对象的openConnection()方法就是调用了URLStreamHandler的openConnection()方法. 如有疑问请参考:JAVA网络编程[第三版], 如下图: 怎样获取服务器输出的数据呢?代码如下: import java.io.IOException; import java.io.InputStream; i