/*
* 先解释上一视频中出现的现象,即为什么MyBrowser程序接收到应答消息头,而我们平时浏览器访问网页没有应答消息头?
* 答:如桌面文件vedio27Internet23所示,左边是客户端(IE),右边是服务端(Tomcat),IE发送请求信息(遵循http协议)
* 给Tomcat,Tomcat收到请求信息并用http解析后将反馈信息(包含:应答消息头、应答体)给客户端,IE接收后能解析应答
* 消息头中的内容(如红色字体、字号等等),然后将应答体在页面显示,这就是为什么我们平日浏览器访问网页所看到的,而看
* 不到应答消息头。
* 但是MyBrowser不能解析应答消息头,看不懂,所以索性将收到的反馈信息全部显示,这就是为什么上一视频中显示的内容。
*/
/*
* 根据以上,考虑给MyBrowse添加一个能解析http协议的东西,所以去API中找。在java.net包中找到如下两个类:
*
* (1)public final class URI extends Object implements Comparable<URI>, Serializable:表示一个统一资源【标识】符 (URI) 引用。
*
* (2)public final class URL extends Object implements Serializable:类 URL 代表一个统一资源【定位】符
*
* 对于URI、URL 和 URN说明:
* URI 是统一资源标识符,而 URL 是统一资源定位符。因此,笼统地说,每个 URL 都是 URI,但不一定每个 URI 都是 URL。这是
* 因为 URI 还包括一个子类,即统一资源名称 (URN),它命名资源但不指定如何定位资源。
*/
package demo;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
public class URLDemo {
public static void main(String[] args) throws MalformedURLException,IOException {
//这里抛出MalformedURLException异常,因为如果str_url中瞎写,会导致无法解析
String str_url = "http://192.168.1.100:8080/myweb/1.html?name=lisi";
URL url = new URL(str_url);
System.out.println("getProtocol:"+url.getProtocol());//获取协议
System.out.println("getHost:"+url.getHost());//获取主机
System.out.println("getPort:"+url.getPort());//获取端口
System.out.println("getFile:"+url.getFile());//获取文件
System.out.println("getPath:"+url.getPath());//获取路径
System.out.println("getQuery:"+url.getQuery());//获取此URL的查询部分
/*
* 运行结果:
* getProtocol:http
* getHost:192.168.1.100
* getPort:8080
* getFile:/myweb/1.html?name=lisi
* getPath:/myweb/1.html
* getQuery:name=lisi
*/
/**
* 在URL类中有如下方法:
* public final InputStream openStream() throws IOException
* 打开到此 URL 的连接并返回一个用于从该连接读入的 InputStream。(即获取流对象)
*/
InputStream in = url.openStream();
byte[] buf = new byte[1024];
int len = 0;
len = in.read(buf);
String text = new String(buf,0,len);
System.out.println(text);
//至此,成功去掉MyBrowser的应答消息头,即成功解析了应答消息头,只显示网页
}
}
/**
* URL类的openStream()方法原理:
* URLConnection conn = url.openConnection();
* InputStream in = conn.getInputStream();
* 第一句是获取url对象的url连接器对象,即将连接封装成了对象:java中内置的可以解析的具体协议的对象+socket
* 第二句利用URLConnection类内的特有方法获取读取流。
*
* 即先拿到URL连接器对象,之后通过获取的读取流,读取相关网页。
*
* 所以这两句代码的功能等同于InputStream in = url.openStream()
*
*/
27-网络编程-23-网络编程(URL&URLConnection)
最新推荐文章于 2022-09-11 09:45:20 发布