目录
前言
因为有一门课的实验要用到这个,而老师不让用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<