网络编程04:URL编程
标签: 网络编程
万维网和URL
万维网(WWW)是一个资料空间。在这个空间中有一样有用的事物:“资源”。“资源”由一个“统一资源定位符”来表示,即URL。这些资源通过超文本传输协议(http)传送给使用者,而后者通过点击链接来获取资源。
URL(Uniform Resource Locator):统一资源定位符,它表示 Internet 上某一资源的地址。通过 URL 我们可以访问 Internet 上的各种网络资源,比如最常见的 www,ftp 站点。浏览器通过解析给定的 URL 可以在网络上查找相应的文件或其他资源。
URL的基本结构由5部分组成:
<传输协议>://<主机名>:<端口号>/<文件名>
例如: http://192.168.1.100:8080/helloworld/index.jsp
超文本传输协议HTTP
HTTP是面向事物的应用层协议,它规定了在浏览器和服务器之间的请求和相应的格式和规则。这里简单介绍HTTP协议,具体在Java Web中详解。
HTTP的操作过程
从协议执行过程来说,浏览器要访问WWW服务器时,首先要完成对WWW服务器的域名解析。一旦获取了服务器的IP地址,浏览器将通过TCP向服务器发送连接建立请求。
万维网工作方式大致如下图所示:
每个万维网服站点都有一个服务器进程,不断地监听TCP的端口80(默认),当监听到连接请求后便与浏览器建立连接。TCP连接建立后,浏览器就向服务器发送请求获取某一Web页面的HTTP请求。服务器收到HTTP请求后,将构建所请求的Web页必须的信息,并通过HTTP响应返回给浏览器。浏览器再将信息进行解释,然后将Web显式给用户,最后TCP连接释放。
GET 和 POST
Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE。对应着对资源的查,改,增,删4个操作。
在客户机和服务器之间进行请求-响应时,两种最常被用到的方法是:GET 和 POST。
GET
- 从指定的资源请求数据,用于获取/查询资源信息。POST
- 向指定的资源提交要被处理的数据,一般用于更新资源信息。
GET方法
请注意,查询字符串(名称/值对)是在 GET 请求的 URL 中发送的:
/test/demo_form.asp?name1=value1&name2=value2
有关 GET 请求的其他一些注释:
- GET 请求可被缓存
- GET 请求保留在浏览器历史记录中
- GET 请求可被收藏为书签
- GET 请求不应在处理敏感数据时使用
- GET 请求有长度限制
- GET 请求只应当用于取回数据
POST 方法
请注意,查询字符串(名称/值对)是在 POST 请求的 HTTP 消息主体中发送的:
POST /test/demo_form.asp HTTP/1.1
Host: w3schools.com
name1=value1&name2=value2
有关 POST 请求的其他一些注释:
- POST 请求不会被缓存
- POST 请求不会保留在浏览器历史记录中
- POST 不能被收藏为书签
- POST 请求对数据长度没有要求
- +
URL类
构造方法
为了表示URL,java.net 中实现了类 URL。我们可以通过下面的构造器来初始化一个 URL 对象:
public URL (String spec);
:
通过一个表示URL地址的字符串可以构造一个URL对象。
例如:URL url = new URL ("http://www.baidu.com/");
public URL(URL context, String spec);
:通过基 URL 和相对 URL 构造一个 URL 对象。例如:URL downloadUrl = new URL(url, “download.html")
public URL(String protocol, String host, String file);
:
通过指定的通信协议,主机名,文件名来创建一个URL
例如:new URL(“http”, “www.baidu.com”, “download. html”);public URL(String protocol, String host, int port, String file);
通过指定的通信协议,主机名,端口号,文件名来创建一个URL
例如: URL gamelan = new URL(“http”, “www.baidu.com”, 80, “download.html”);
类URL的构造方法都声明抛出非运行时异常,必须要对这一异常进行处理,通常是用 try-catch 语句进行捕获。
常用方法
获取属性
一个URL对象生成后,其属性是不能被改变的,但可以通过它给定的方法来获取这些属性:
public String getProtocol()
获取该URL的协议名public String getHost()
获取该URL的主机名public String getPort()
获取该URL的端口号public String getPath()
获取该URL的文件路径public String getFile()
获取该URL的文件名public String getRef()
获取该URL在文件中的相对位置public String getQuery()
获取该URL的查询名
访问资源
URL有两种方法可以用来访问Interent上资源。
openStream()
利用URL类的openStream()
方法,能从网络上读取数据。openStream()方法与指定的URL建立连接并返回InputStream类的对象。
能从网络上读取数据
若希望输出数据,例如向服务器端的 CGI (公共网关接口-Common Gateway Interface-的简称,是用户浏览器和服务器端的应用程序进行连接的接口)程序发送一些数据,则必须先与URL建立连接,然后才能对其进行读写,此时需要使用 URLConnection 。
OpenConnection
使用URL的openConnection()
方法创建一个URLConnection类的对象,表示到URL所引用的远程对象的连接。。再通过URLConnection对象获取相应的输入/输出流。
当与一个URL建立连接时,首先要在一个 URL 对象上通过方法 openConnection() 生成对应的 URLConnection 对象。如果连接过程失败,将产生IOException.
例子
package charNet;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
public class TestURL {
public static void main(String[] args) throws Exception {
//创建一个URL对象
URL url = new URL("https://www.baidu.com/");
System.out.println(url.getProtocol());
System.out.println(url.getHost());
System.out.println(url.getPort());
System.out.println(url.getFile());
//如何读取服务端的资源
InputStream is = url.openStream();
byte[] b = new byte[1024];
int len;
while ((len = is.read(b)) != -1) {
String str = new String(b,0,len);
System.out.println(str);
}
is.close();
//如何既有数据的输入,又有数据的输出,则考虑使用URLConnection
URLConnection urlConnection = url.openConnection();
InputStream is1 = urlConnection.getInputStream();
FileOutputStream fos = new FileOutputStream(new File("abc.txt"));
byte[] b1 = new byte[20];
int len1;
while ((len1 = is1.read()) != -1) {
fos.write(b1,0,len1);
}
fos.close();
is1.close();
}
}