[09/51-52周主题] – Java Net and XML parser
本周主题:Java Net and XML Parser 分两部分:一部Java Net(大部分来自Java Doc), 一部分XML Parser, 通过一个Twitter的例子来描述简单的使用情况。 一、Java Net java.net 包的概述: java.net包大致可分为两部...
本周主题:Java Net and XML Parser
分两部分:一部Java Net(大部分来自Java Doc), 一部分XML Parser, 通过一个Twitter的例子来描述简单的使用情况。
一、Java Net
java.net 包的概述:
java.net包大致可分为两部分:
低级API - 用于处理以下抽象:
地址,也就是网络标识符,如 IP 地址。
套接字,也就是基本双向数据通信机制。
接口,用于描述网络接口。
高级API - 用于处理以下抽象:
URI,表示统一资源标识符。
URL,表示统一资源定位符。
连接,表示到 URL 所指向资源的连接。
地址
在整个 java.net API 中,地址或者用作主机标识符或者用作套接字端点标识符。
InetAddress 类是表示 IP(Internet 协议)地址的抽象,它拥有两个子类:
用于 IPv4 地址的 Inet4Address。
用于 IPv6 地址的 Inet6Address。
但是,在大多数情况下,不必直接处理子类,因为 InetAddress 抽象应该覆盖大多数必需的功能。
套接字
套接字是在网络上建立机器之间的通信链接的方法。java.net 包提供 4 种套接字:
Socket 是 TCP 客户端 API,通常用于将 (java.net.Socket.connect(SocketAddress)) 连接到远程主机。
ServerSocket 是 TCP 服务器 API,通常接受 (java.net.ServerSocket.accept) 源于客户端套接字的连接。
DatagramSocket 是 UDP 端点 API,用于发送和接收 java.net.DatagramPackets。
MulticastSocket 是 DatagramSocket 的子类,在处理多播组时使用。
使用 TCP 套接字的发送和接收操作需要借助 InputStream 和 OutputStream 来完成,这两者是通过 java.net.Socket.getInputStream 和 java.net.Socket.getOutputStream 方法获取的。
高级API
java.net 包中的许多类可以提供更加高级的抽象,允许方便地访问网络上的资源。这些类为:
URI 是表示在 RFC 2396 中指定的统一资料标识符的类。顾名思义,它只是一个标识符,不直接提供访问资源的方法。
URL 是表示统一资源定位符的类,它既是 URI 的旧式概念又是访问资源的方法。
URLConnection 是根据 URL 创建的,是用于访问 URL 所指向资源的通信链接。此抽象类将大多数工作委托给底层协议处理程序,如 http 或 ftp。
HttpURLConnection 是 URLConnection 的子类,提供一些特定于 HTTP 协议的附加功能。
建议的用法是使用 URI 指定资源,然后在访问资源时将其转换为 URL。从该 URL 可以获取 URLConnection 以进行良好控制,也可以直接获取 InputStream。
下面是一个示例:
[code lang="java"]
URI uri = new URI("http://java.sun.com/");
URL url = uri.toURL();
InputStream in = url.openStream();
[/code]
URLConnection 和 HttpURLConnection 的使用:
抽象类 URLConnection 是所有表示应用程序与 URL 之间通信链路的类的超类。该类的实例可以用来对由 URL 引用的资源进行读取和写入操作
HttpURLConnection 仅是支持了 HTTP 特定功能的 URLConnection
通过调用 URL 的 openConnection 方法产生一连接对象。
操纵设置参数和一般请求属性。
使用 connect 方法,实现对远程对象的实际连接。
远程对象一旦可用,就可以访问远程对象的域和内容。
通过如下的方法修改设置参数:
setAllowUserInteraction
setDoInput
setDoOutput
setIfModifiedSince
setUseCaches
通过使用如下的方法修改一般请求属性:
setRequestProperty
AllowUserInteraction 和 UseCaches 参数的缺省值可以通过使用 setDefaultAllowUserInteraction 和 setDefaultUseCaches 方法来设置。 而一般请求属性的缺省值可以通过方法 setDefaultRequestProperty 来设置 。
上面的每个 set 方法都有相应 get 方法来获取参数和一般请求属性的值。可用的特定参数和一般请求属性是特定于协议的。
对远程对象的连接完成后,用下列方法访问报头域和内容:
getContent
getHeaderField
getInputStream
getOutputStream
确认报头域能够被频繁访问。方法:
getContentEncoding
getContentLength
getContentType
getDate
getExpiration
getLastModified
提供对这些域的便利访问。 getContentType 方法由 getContent 方法调用以确定远程对象的类型; 子类来覆盖方法 getContentType 可能是有利的。
下面是一个通过Twitter API去获信息的demo:
[code lang="java"]
URL url = new URL("http://t.bbercn.com/statuses/user_timeline.xml");
String username = (String) params[0];
String password = (String) params[1];
String user_paw = username + ":" + password;
String encoding = "Basic " + Base64Converter.encode(user_paw.getBytes());
URLConnection uc = url.openConnection();
uc.setRequestProperty("Authorization", encoding);
InputStream content = (InputStream) uc.getInputStream();
[/code]
剩下的工作就是对InputStream 进行本地处理,Twitter返回的是XML,那么我们下面就对XML进行解析,获取我们要获取的信息。
XML Parser
关于 xml 解析的工具有很多,具体可以看这里:http://www.open-open.com/31.htm 罗列的一些。
下面通过Commons-Digester来处理上面我们获取的InputStream
[code lang="java"]
public class ParseTools {
private List statuses = new ArrayList<Status>();
public List<Status> getStatuses() {
Collections.sort(statuses);
return statuses;
}
public void parseStatus(InputStream stream) throws IOException, SAXException {
Digester digester = new Digester();
digester.setValidating(false);
digester.push(this);
digester.addObjectCreate("statuses/status", Status.class);
//status
digester.addBeanPropertySetter("statuses/status/id");
digester.addBeanPropertySetter("statuses/status/created_at");
digester.addBeanPropertySetter("statuses/status/text");
digester.addBeanPropertySetter("statuses/status/source");
digester.addBeanPropertySetter("statuses/status/truncated");
digester.addBeanPropertySetter("statuses/status/in_reply_to_status_id");
digester.addBeanPropertySetter("statuses/status/in_reply_to_user_id");
digester.addBeanPropertySetter("statuses/status/favorited");
digester.addBeanPropertySetter("statuses/status/in_reply_to_screen_name");
//user
digester.addObjectCreate("statuses/status/user", User.class);
digester.addBeanPropertySetter("statuses/status/user/id");
digester.addBeanPropertySetter("statuses/status/user/name");
digester.addBeanPropertySetter("statuses/status/user/screen_name");
digester.addBeanPropertySetter("statuses/status/user/description");
digester.addBeanPropertySetter("statuses/status/user/location");
digester.addBeanPropertySetter("statuses/status/user/profile_image_url");
digester.addBeanPropertySetter("statuses/status/user/url");
digester.addBeanPropertySetter("statuses/status/user/isProtected");
digester.addBeanPropertySetter("statuses/status/user/followers_count");
digester.addBeanPropertySetter("statuses/status/user/friends_count");
digester.addSetNext("statuses/status/user", "setUser");
digester.addSetNext("statuses/status", "addStatuses", Status.class.getName());
digester.parse(stream);
}
public void addStatuses(Status status) {
Status d = new Status();
d.setId(status.getId());
d.setCreated_at(status.getCreated_at());
d.setFavorited(status.isFavorited());
d.setText(status.getText());
d.setSource(status.getSource());
d.setTruncated(status.isTruncated());
d.setIn_reply_to_screen_name(status.getIn_reply_to_screen_name());
d.setIn_reply_to_status_id(status.getIn_reply_to_status_id());
d.setIn_reply_to_user_id(status.getIn_reply_to_user_id());
d.setUser(status.getUser());
getStatuses().add(d);
}
}
[/code]
评论交流
暂无评论,欢迎留下你的想法