UN4L4——HTTP下载数据

HTTP下载数据

  1. Head​请求类型:主要用于获取文件的一些基础信息 可以用于确定文件是否存在

  2. Get​请求类型:主要用于传递信息给服务器,用于获取具体信息,服务器返回的信息,可以通过Response​中的流来获取
    Get​请求时,可以在连接中携带一些额外参数(在链接后面加上:?参数名=参数值&参数名=参数值&参数名=参数值&...​)
    正常的http服务器应用程序,都会去解析Get​请求时连接中的参数进行逻辑处理(后端程序的工作)

  3. 我们主要要掌握的知识点:

    1. 额外参数按格式书写
    2. 通过response​对象中的流来获取返回的数据(数据的类型多种多样,可以是文件、自定义消息等等,我们按照规则解析即可)
  4. 在和http服务器通信时,我们经常会使用额外参数的形式传递信息,特别是以后和一些运营平台对接时

  5. 文件下载功能和Ftp非常类似,只是其中使用的类、协议、请求类型不同而已

检测资源可用性

首先创建一个HttpWebRequest​对象,Create​方法传入要检测的资源的地址
操作命令使用WebRequestMethods.Http.Head​,设置请求的超时时间
然后获取HttpWebResponse​对象,通过HttpWebResponse​对象的状态码来确认是否存在资源

还可以通过HttpWebResponse​对象检测资源的长度和类型,获取完毕后就需要关闭HttpWebResponse​对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
try
{
//创建一个HTTP请求,获取消息头
HttpWebRequest request = WebRequest.Create(new Uri("http://192.168.1.102/Http_Server/下载测试.png")) as HttpWebRequest;
request.Method = WebRequestMethods.Http.Head;
//设置超时时间
request.Timeout = 2000;
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
//资源存在
if (response.StatusCode == HttpStatusCode.OK)
{
print("文件存在且可用");
print(response.ContentLength); //输出文件长度
print(response.ContentType); //输出文件类型
response.Close();
}
//资源不存在
else
print("文件不可用:" + response.StatusCode);
}
catch (WebException e)
{
print("获取出错:" + e.Message + e.Status);
}

下载资源

检测资源可用性后,就可以下载资源
同样新创建一个HttpWebRequest​对象,Create​方法传入要下载的资源的地址,
设置操作命令为WebRequestMethods.Http.Get​,设置请求的超时时间
然后获取HttpWebResponse​对象,通过HttpWebResponse​对象的状态码来确认是否存在资源

确认存在资源后,创建一个文件流,并从HttpWebResponse​对象获取下载流,
声明一个字节数组,从下载流获取数据,再将数据写入到文件流内,循环执行以上逻辑直到下载流内不再有新数据
下载完后,关闭下载流、文件流和HttpWebResponse​对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
try
{
//创建HTTP通讯用连接对象HttpWebRequest对象
HttpWebRequest request = WebRequest.Create(new Uri("http://192.168.1.102/Http_Server/下载测试.png")) as HttpWebRequest;
//设置请求类型 或 超时时间
request.Method = WebRequestMethods.Http.Get;
request.Timeout = 3000;
//发送请求,获取响应结果HttpWebResponse对象
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
//如果连接上了
if (response.StatusCode == HttpStatusCode.OK)
{
print(Application.persistentDataPath);
//创建本地文件流,传入要保存的位置
using (FileStream fileStream = File.Create(Application.persistentDataPath + "/httpDownLoad.png"))
{
//获取下载流
Stream downLoadStream = response.GetResponseStream();
byte[] bytes = new byte[2048];
//读取数据
int contentLength = downLoadStream.Read(bytes, 0, bytes.Length);
//一点一点的写入本地
while (contentLength != 0)
{
fileStream.Write(bytes, 0, contentLength);
contentLength = downLoadStream.Read(bytes, 0, bytes.Length);
}
fileStream.Close();
downLoadStream.Close();
response.Close();
}
print("下载成功");
}
//如果连接失败
else
{
print("下载失败:" + response.StatusCode);
}
}
catch (WebException e)
{
print("下载出错:" + e.Message + e.Status);
}

Get请求类型携带额外信息

我们在进行HTTP通信时,可以在地址后面加一些额外参数传递给服务端,一般在和短连接游戏服务器通讯时,需要携带额外信息
举例:http://www.aspxfans.com:8080/news/child/index.asp?boardID=5&ID=24618&page=1

这个链接可以分成几部分:

  1. 协议部分:取决于服务器端使用的哪种协议

    • http://​ —— 普通的http超文本传输协议
    • https://​ —— 加密的超文本传输协议
  2. 域名部分:www.aspxfans.com​,也可以填写服务器的公网IP地址

  3. 端口部分:8080​,可以不写,如果不写默认为80

  4. 虚拟目录部分:news/child/​,域名后的/​开始,到最后一个/​之前的部分

  5. 文件名部分:index.asp​,?​之前的最后一个/​后的部分

  6. 参数部分:boardID=5&ID=24618&page=1
    ?​之后的部分就是参数部分,多个参数用&​分隔开,这里有三个参数

    • boardID = 5
    • ID = 24618
    • page = 1

我们在和服务端进行通信时,只要按照这种规则格式进行通信,就可以传递参数给对象,主要可用于:

  1. web网站服务器
  2. 游戏短连接服务器

等等