Java使用socket通过http下载文件

前言

因为有一门课的实验要用到这个,而老师不让用URL对象,只能用socket,网上关于socket下载的资料少之又少,故总结之

socket套接字

套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和关闭等操作。套接字允许应用程序将I/O插入到网络中,并与网络中的其他应用程序进行通信。网络套接字是IP地址与端口的组合。

----百度百科

可以把套接字理解为一个网络上的 “qq” 它可以发送,接收,与指定的主机的指定端口交换数据,而java中也有Socket的类,创建Socket对象可以连接到目标主机的端口,这个连接是自动(Socket的底层帮你做TCP连接的)

值得注意的是socket可以帮助我们跳过TCP/IP协议(或者是UDP)繁琐的包头,我们通过Socket对象的getInputStream()就能获得 掐头去尾 (去掉TCP协议头)的数据, 或者通过getOutputStream()获得输出流,发送的数据将会自动被打包

http协议

HTTP协议(HyperText Transfer Protocol,超文本传输协议)是因特网上应用最为广泛的一种网络传输协议,所有的WWW文件都必须遵守这个标准。
HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。

----菜鸟教程

http是基于TCP/IP来传递数据的,而socket可以帮助我们优雅地(并不)从TCP协议流中获取数据,所以我们理所应当的想到,可以利用http协议,通过socket打开对应主机的连接,进而获取文件或者是文本数据

正文

向服务器请求文件,首先我们要告诉服务器:我要这个文件

http请求头:向服务器请求文件

通过向服务器发送http请求头(其实就是发送字符串),服务器会根据请求头的内容,做出响应

如果要完成文件的下载,需要向服务器发送这些头:

其他头详情见:https://cloud.tencent.com/developer/chapter/13542

这里以请求一个图片文件为例:需要发送4个包头
https://www.baidu.com/img/bd_logo1.png

1. GET请求,请求服务器发送uri指定的文件

// uri是请求的文件在服务器上的相对地址
// 比如 https://www.baidu.com/img/bd_logo1.png
// uri 就是 img/bd_logo1.png
要发送的字符串: "GET " + uri + " HTTP/1.1\r\n"
2. 连接请求

// domainName是请求的服务器的域名(或者是IP地址)
// 比如 https://www.baidu.com/img/bd_logo1.png
// domainName 就是  www.baidu.com
要发送的字符串: "Host: " + domainName + "\r\n"
3. 终止连接

要发送的字符串: "Connection: close\r\n"
4. 包头结束
// 注意此处的不可省略
要发送的字符串: "\r\n"

http请求头:分析服务器回传的头的信息

除了告诉服务器我们要什么,我们还要分析服务器回传的http头信息,这表明我们的url指向的是何种类型的文件,他的大小是多少?

例子:服务器回传的http头部信息:

这些信息是请求这个url来获取的
https://img.nga.178.com/attachments/mon_202004/28/-64xyuQ5-6pbtK1xT3cSiw-bt.jpg.medium.jpg

HTTP/1.1 200 OK
Server: JSP3/2.0.14
Date: Sat, 09 May 2020 08:18:52 GMT
Content-Type: image/jpeg
Content-Length: 53456
Connection: close
ETag: "5ea707dc-d0d0"
Last-Modified: Mon, 27 Apr 2020 16:27:08 GMT
Expires: Wed, 27 May 2020 16:28:28 GMT
Age<
  • 5
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值