【java】网络编程——URL统一资源定位符

URL

统一资源定位符:定位资源的,定位互联网上的某一个资源。

DNS域名解析:以www.baidu.com为例,其实这个是域名,其本质应该是IP地址,那为什么我们通过域名就可以访问网站呢,因为存在DNS域名解析,会帮我们把域名解析为IP,然后再根据IP去访问网站。

URL通常的组成:

协议://ip地址:端口/项目名/资源

简单示例

示例代码

package protocol;

import java.net.MalformedURLException;
import java.net.URL;

public class URLDemo01 {
    public static void main(String[] args) throws MalformedURLException {
        URL url = new URL("http://localhost:8080/helloworld/securityFile.txt?username=admin&password=123456");
        System.out.println(url.getProtocol()); // 协议
        System.out.println(url.getPort()); // 端口
        System.out.println(url.getHost()); // 主机ip
        System.out.println(url.getPath()); // 文件
        System.out.println(url.getFile()); // 全路径
        System.out.println(url.getQuery()); // 参数
    }
}

运行结果

http
8080
localhost
/helloworld/securityFile.txt
/helloworld/securityFile.txt?username=admin&password=123456
username=admin&password=123456

使用URL下载网络资源

示例代码

在自己的电脑上也可以跑哦~~~

package protocol;

import javax.net.ssl.HttpsURLConnection;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;

public class URLDemo02 {
    public static void main(String[] args) throws Exception {
        // 找到要下载的资源的地址
        URL url = new URL("https://tse1-mm.cn.bing.net/th/id/OIP-C.G2A-qmMydOw5rUQENRetnAHaHL?rs=1&pid=ImgDetMain");
        // 连接到这个资源 HTTP协议
        HttpsURLConnection httpsURLConnection= (HttpsURLConnection) url.openConnection();
        // 连接好后就可以读了,网上的资源都是流
        InputStream inputStream = httpsURLConnection.getInputStream();
        FileOutputStream fos = new FileOutputStream("quanwei.jpg");
        byte[] buffer = new byte[1024];
        int len = 0;
        while ((len = inputStream.read(buffer)) != -1) {
            fos.write(buffer, 0, len);
        }

        // 用完了记得关(关流、关连接)
        fos.close();
        inputStream.close();
        httpsURLConnection.disconnect();

    }
}

代码思路分析:

资源定位
  • 使用 URL 类创建一个 URL 对象,构造函数传入要下载资源的完整 URL 地址,该地址指向一个图片资源。通过 URL 对象,程序明确了要访问的网络资源位置。
建立连接
  • 调用 url.openConnection() 方法打开与指定 URL 的连接,由于该 URL 是 HTTPS 协议,将返回的连接对象强制转换为 HttpsURLConnection 类型。此步骤建立了程序与网络资源之间的通信通道。
数据读取
  • 调用 httpsURLConnection.getInputStream() 方法获取与该连接关联的输入流,网络上的资源通常以流的形式传输,通过该输入流程序可以读取到资源的二进制数据。
本地存储准备
  • 创建一个 FileOutputStream 对象,构造函数传入本地文件名 "quanwei.jpg",这意味着程序将把从网络读取的数据写入到本地的 quanwei.jpg 文件中,为数据的本地存储做好准备。
数据传输
  • 定义一个字节数组 buffer,长度为 1024,作为数据读取和写入的缓冲区。
  • 使用 while 循环从输入流中读取数据,每次读取的数据存储在 buffer 中,read 方法返回实际读取的字节数,存储在 len 变量中。当 read 方法返回 -1 时,表示已经读取到流的末尾,循环结束。
  • 在循环内部,调用 fos.write(buffer, 0, len) 方法将 buffer 中从索引 0 开始、长度为 len 的数据写入到本地文件中,实现数据从网络到本地的传输。
资源释放
  • 依次调用 fos.close()inputStream.close()httpsURLConnection.disconnect() 方法,关闭文件输出流、输入流并断开与网络资源的连接,确保资源被正确释放,避免资源泄漏。
总结

这段代码的主要功能是从指定的 HTTPS 地址下载图片资源,并将其保存到本地文件中,通过合理的资源管理和数据传输操作,实现了网络资源的下载功能。

去爬视频(有兴趣的可以看一下)

1.首先去找到你要爬的视频。

2.打开网页的开发人员工具。(笔记本快捷键,Fn+F12)

3.选择网络标签页,刷新网页后播放视频,播放几秒就可暂停视频了

4.选择XHR/Fetch标签

5.找到状态为206,类型为xhr的包,有很多,点击一个即可

6.写代码了,首先设置好url,然后打开连接,根据网页的协议建立连接哦

7.设置请求头,我们要设置两个参数

  • 一个是user-agent
  • 一个是referer

都可以在这个包下找到,然后使用连接的setRequestProperty设置即可,里面存储是map,所以要“user-agent”,“你在那个包下找到的user-agent”,设置referer同理。

然后就是写文件了,注意视频是.mp4结尾,音频是.mp3结尾

package protocol;

import javax.net.ssl.HttpsURLConnection;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.URL;

public class URLDemo02 {
    public static void main(String[] args) throws Exception {
        // 要下载的资源地址
        URL url = new URL("https://cn-hbwh-fx-01-13.bilivideo.com/upgcxcode/26/63/1618156326/1618156326-1-100022.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1741764626&gen=playurlv2&os=bcache&oi=1899621715&trid=00000bf8086dede74ed19658b52d970488d4u&mid=0&platform=pc&og=hw&upsig=a938622b41ec856059156385af362122&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform,og&cdnid=3881&bvc=vod&nettype=0&orderid=0,3&buvid=D940A6F3-DD8A-7AF7-6F51-D355A298389459235infoc&build=0&f=u_0_0&agrr=0&bw=11266&np=151388311&logo=80000000");
        // 打开连接
        HttpsURLConnection httpsURLConnection = (HttpsURLConnection) url.openConnection();
        // 设置请求头
        httpsURLConnection.setRequestProperty("user-agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36 Edg/134.0.0.0");
        httpsURLConnection.setRequestProperty("referer","https://www.bilibili.com/video/av1606197039/");

        // 获取输入流
        InputStream inputStream = httpsURLConnection.getInputStream();
        // 创建文件输出流
        FileOutputStream fos = new FileOutputStream("video1.mp4");
        byte[] buffer = new byte[1024];
        int len = 0;
        while ((len = inputStream.read(buffer)) != -1) {
            fos.write(buffer, 0, len);
        }

        // 关闭流和连接
        fos.close();
        inputStream.close();
        httpsURLConnection.disconnect();
    }
}

你可能感兴趣的:(java,网络,开发语言)