分享
 
 
 

Java高层网络编程

王朝java/jsp·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

java.net 包中的类和接口提供了可用于低层和高层网络编程的 API。低层 API 可以让你直接访问网络协议,但是为此你不得不使用低层的 TCP 套接字和 UDP 数据包。高层的 API (如 URL, URLConnection 和 httpURLConnection 等类) 可以使你更快的开发网络应用,却不需要写很多代码。另一篇文章,《Network Programming with J2SE 1.4》会告诉你如何使用低层的套接字进行网络编程。这篇文章的重点则放在如何使用 java.net 包中的高层 API 开发基于 HTTP 的应用程序。

这篇文章将有如下内容:

? 概览 HTTP

? 概览 java.net 包的高层 API

? 示例说明如何使用高层 API

? 制作一个可以下载股票行情的应用程序

? 演示如何提交数据到网页服务器

? 概览 HTTP 的验证并展示如何保护你的网络资源

? 提供代码实例演示如何执行 HTTP 的验证

概览 HTTP

超文本传输协议 (Hypertext Transfer Protocol, HTTP) 是一个“请求-回应”的应用协议。这个协议支持一套固定的方法如 GET、POST、PUT、DELETE 等。一般用 GET 方法向服务器请求资源。这里有两个 GET 请求的例子:

GET / HTTP/1.1

GET /names.html HTTP/1.1

另外,你可以使用 GET 和 POST 方法向服务器发送数据,它们向服务器发送数据的方式是不同的:

? GET 方法:输入的数据将作为 URL 的一部分发送

? POST 方法:输入数据作为一个独立的实体发送

考虑一下下面的 HTML 表单:

这个表单会提交到 http://www.javacourses.com/servlet/getMarks 由 Servlet 处理。该表单使用了 GET 方法来传输信息。如果用户输入一个学号――比如 556677――并点击 GetMarks 按钮,表单数据就会作为 URL 的一部分传送到 Servlet 中。经过编码之后的 URL 就是:http://www.javacourses.com/servlets/getMarks?number=556677。

在使用 POST 方法的情况下,传输数据时不会将数据作为 URL 的一部分;它们会作为一个独立的实体来传输。因此,POST 方法更安全,你也可以用这个方法传输更多的数据。而且用 POST 传输的数据不一定要是文本,用 GET 方法传输的却一定要是文本。

消息息格式

请求消息指定了方法名称 (GET 或者 POST)、URL、协议版本号、头部消息和可选消息。头部消息也许会包含请求信息和客户端信息,如接受的内容类型、浏览器名称以及验证数据。返回消息指定了协议版本、响应代码和原因。不管执行是否成功,响应代码和原因都会报告。一些响应代码如下:

200 OK: Request succeeded. The requested resource can be found later in this message.

301 Moved Permanently: Requested resource has moved. New location is specified later in this message.

400 Bad Request: Request message is not understood by the server.

404 Not Found: Requested document is not found on this server.

关于 HTTP 和所有返回代码的信息可以在 HTTP 1.1 规范 RFC2616 中找到。

下面是一个请求消息由浏览器到服务器的例子。这里请求的 URL 是 http://java.sun.com:

GET / HTTP/1.1

Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg,

application/vnd.ms-powerpoint, application/vnd.ms-excel,

application/msword, */*

Accept-Language: en-ca

Accept-Encoding: gzip, deflate

User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows 98; YComp 5.0.0.0)

Host: java.sun.com

Connection: Keep-Alive

Cookie: SUN_ID=24.80.19.177:28346100732290;

SunONEUserId=24.80.19.177:86521021960770

然后这里是服务器对这个请求的回复消息:

HTTP/1.1 200 OK

Server: Netscape-Enterprise/6.0

Date: Mon, 14 Oct 2002 15:18:04 GMT

Content-type: text/html

Connection: close

概览 java.net 包的高层 API

java.net 包中含有高层 API。它们实现了一些最常用的基于 TCP 的协议,如 HTTP 和 FTP 等。其中两个主要的类是 URL 和 URLConnection。另一个有用的类是 HttpURLConnection,它是 URLConnection 的子类,支持 HTTP 的特性。

URL (Uniform Resource Locator,统一资源定位器) 是一个描述 Internet 中文档 (或者其它常见的资源) 位置的地址。URL 的样子就像这样:

protocol://machineName:port/resource

注意 URL 类不是基于 HTTP 的,这一点非常重要。它支持 FTP、HTTPS 和 FILE 协议。所以,对于 URL 类来说,下面所有 URL 都是有效的。

http://java.sun.com

http://localhost:8080/myApplication

http://www.yahoo.com/index.html

http://www.yahoo.com

ftp://ftp.borland.com

ftp://ftp.sun.com

https://www.scotiaonline.scotiabank.com

https://central.sun.net

file:///C:/j2sdk1.4/docs/api/index.html

你在浏览器里输入一个 URL 的时候,浏览器产生一个 HTTP GET (或者 POST) 命令寻找 (或者查询) URL 请求的资源。如果没有指定要查询的的资源,被查询的就会是默认文档 (通常是 index.html)。

读取 URL 的内容

让我们以一个简单的应用程序开始,它将会直接从 URL 读取内容。不妨先尝试一下使用低层的套接字来读取,请看示例代码 1。在这个例子中,用户在命令行输入资源的 URL,然后在 80 端口 (默认的 HTTP 服务器端口号) 打开一个套接字并建立相应的输入输出流。输出流用来向 HTTP 服务器发送 HTTP 命令 (比如 GET),输入流则用来读取 HTTP 服务器的返馈。注意,在这个例子中,服务器回应的头信息也会被读入 (这是 URL 内容之外的东西)。

示例代码 1: ReadURL1.java

import java.net.*;

import java.io.*;

public class ReadURL1 {

public static void main(String argv[]) throws Exception {

final int HTTP_PORT = 80;

if(argv.length != 1) {

System.out.println("Usage: java ReadURL1 ");

System.exit(0);

}

Socket socket = new Socket(argv[0], HTTP_PORT);

BufferedWriter out

= new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));

BufferedReader in

= new BufferedReader(new InputStreamReader(socket.getInputStream()));

out.write("GET /index.html HTTP/1.0\n\n");

out.flush();

String line;

StringBuffer sb = new StringBuffer();

while((line = in.readLine()) != null) {

sb.append(line);

}

out.close();

in.close();

System.out.println(sb.toString());

}

}

// end code

你运行这个例子的时候请注意,URL 必须是一个域名如 java.sun.com 或者 IP 地址。不能加上 http:// 作为 URL 的一部分。如果你要解决这个问题,你就得解析输入的内容并找出它使用什么协议,端口号和要请求什么资源。你也可以使用 URL 类,它提供了一些非常有用的方法,如 getProtocal、getPort、getHost 和 getFile 等。

使用 URL 类

要从 URL 读取内容,可以用 URL 类非常容易的实现,就像示例代码 2 所展示的那样。这使得直接从 URL 读取内容变得简单。用这种方法读取的内容不包含服务器回应的头信息,所以不需要你去解析它们了。运行这个例子时要输入有效的 URL ,就像 protocol://domainName:port/resource 这样。URL 类会解析输入的 URL 并处理低层的麻烦的工作。

示例代码 2:ReadURL2.java

import java.net.*;

import java.io.*;

public class ReadURL2 {

public static void main(String argv[]) throws Exception {

if(argv.length != 1) {

System.out.println("Usage: java ReadURL2 ");

System.exit(0);

}

URL url = new URL(argv[0]);

BufferedReader in

= new BufferedReader(new InputStreamReader(url.openStream()));

String line;

StringBuffer sb = new StringBuffer();

while ((line = in.readLine()) != null) {

sb.append(line);

}

in.close();

System.out.println(sb.toString());

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有