02-阿里云与HTTP协议
一、阿里云服务器搭建
1.申请阿里云服务器
阿里云免费试用 - 阿里云
2.设置系统版本
3.配置云服务器的ssh协议(这里是简捷版本,不是标准版)
1.重置密码
4.ssh登录阿里云服务器(我的公网ip是:8.138.205.226)
用户名:root
公网ip地址:8.138.205.229
密码:********
5.关闭阿里云防火墙
6.vscode远程登录云服务器开发
1.用阿里云的用户与IP
2.连接成功如下
3.编写一个服务器代码(即该服务器允许多个客户端连接并接收数据)
这个是云服务器上写的代码:运行等待连接,然后可以用手机的app”网络调试助手“验证,连接服务器的(ip地址,端口)然后通过手机发送数据给电脑即可。
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <pthread.h>
#include <stdlib.h>
struct sockaddr_in addr;
void *rec_msg(void *arg)
{
int *client_socket =arg;
while (1)
{
char buf[1024] = {0};
int ret = read(*client_socket, buf, sizeof(buf));
if (ret <= 0)
{
perror("接收消息失败");
break;
}
printf("从客户端接收的消息: %s\n", buf);
//打印对方的ip地址
printf("客户端的ip地址: %s\n", inet_ntoa(addr.sin_addr));
}
return NULL;
}
int main()
{
// 1.创建socket通信对象
int tcp_socket = socket(AF_INET, SOCK_STREAM, 0);
if (tcp_socket < 0)
{
perror("创建通信套接字失败\n");
return -1;
}
else
{
printf("创建通信套接字成功\n");
}
// 设置地址信息
//struct sockaddr_in addr; // 创建新的结构体,不用老的结构体(因为老的结构体没有明确的地址和端口号的说明)
addr.sin_family = AF_INET; // IPV4网络协议
addr.sin_port = htons(8898); // 设置端口号(把主机转换成网络通用的大端序,因为不同的主机的字节序是不一样的,根据CPU决定)
addr.sin_addr.s_addr = INADDR_ANY; // 设置IP地址(把字符串转换成unsigned int类型)
// addr.sin_addr.s_addr = INADDR_ANY;
// 2.绑定服务器地址
int ret = bind(tcp_socket, (const struct sockaddr *)&addr, sizeof(addr));
if (ret < 0)
{
perror("绑定失败\n");
return -1;
}
else
{
printf("绑定成功\n");
}
// 3.listen监听
ret = listen(tcp_socket, 1);
if (ret < 0)
{
perror("监听失败\n");
}
else
{
printf("监听成功\n");
}
// 4.接受客户端连接请求
while (1)
{
// 4.等待接收连接请求
printf("等待客户端连接\n");
int new_socket = accept(tcp_socket, NULL, NULL);
if (new_socket < 0)
{
perror("接受失败\n");
return -1;
}
else
{
printf("接收成功 %d\n", new_socket);
//创建一个线程用于发送信息
pthread_t thread_id;
pthread_create(&thread_id, NULL, rec_msg, &new_socket);
}
}
close(tcp_socket);
return 0;
}
二、HTTP服务器搭建
超文本传输协议(HypertextTransfer Protocol,HTTP)
是一个简单的请求-响应协议,它通常运行在 TCP之上。
它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。
请求和响应消息的头以ASCII形式给出; 而消息内容则具有一个类似MIME的格式。
超文本传输协议是一种用于分布式、协作式和超媒体信息系统的应用层协议,
是万维网WWW(World Wide Web)的数据通信的基础。
1.阿帕奇http服务器安装
sudo apt-get update #更新软件源
sudo apt-get install apache2 #安装阿帕奇http服务器
sudo systemctl restart apache2 #重启阿帕奇服务器
然后在浏览器上就可以通过上面的公网ip访问我们自己的网站了。
我们也可以在/var/www/html修改阿帕奇服务器的网站界面。
在云服务器的终端上进入/var/www/html
然后修改html文件内容即可
也可以在我们自己搭建的网页上面上传一些资料上去,但是这个免费使用3个月的阿里云服务器是2核2g内存,40G硬盘的云电脑配置。所以上传不了多少东西,且只能免费使用3个月。到时候如果自己有兴趣的可以买一个服务器和域名,这个别人就可以通过域名访问你自己搭建的网页了。
mkdir /var/www/html/music #创建音乐目录
mkdir /var/www/html/movie #创建电影目录
scp 1.mp3 root@8.138.205.229:/var/www/html/music #上传音乐到http服务器中
scp 1.mp4 root@8.138.205.229:/var/www/html/movie #上传电影到http服务器中
......
上传完后,访问http服务器中的文件,浏览器里输入:公网ip:8.138.205.229/movie即可看到自己上传的视频。
三、免费HTTP服务器
这里我们自己做项目要用到网络通信的,api接口的,可以去找免费的api接口。
青云客智能聊天机器人API
免费API - 提供免费接口调用平台
夏柔的个人主页免费API - 提供免费接口调用平台
v.api.aa1.cn/api/api-tianqi-3/index.php?msg=广州&type=1 #天气API接口
⭐⭐怎么查看接口的ip地址:1.通过ping (域名) 。2.进入到该api接口然后按f12,然后按f5即可看到。
1、Linux_C_http 请求(代码请求访问)
1.http 请求流程图
2.⭐(重点,难点) HTTP请求协议设计(这个是请求的重点代码)
协议:双方通信的一种规则,一种约定。 简单理解(暗号)。
例子:这是一个舔狗的api接口。
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h> /* superset of previous */
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
int main()
{
// 1.创建TCP通信对象
int tcp_socket = socket(AF_INET, SOCK_STREAM, 0);
if (tcp_socket < 0)
{
perror("创建对象失败\n");
return -1;
}
else
{
printf("创建对象成功\n");
}
// 2.设置服务器地址信息
struct sockaddr_in addr;
addr.sin_family = AF_INET; // IPV4网络协议
addr.sin_port = htons(80); // 80 http服务器默认端口
addr.sin_addr.s_addr = inet_addr("47.115.92.82"); // 设置IP地址
int ret = connect(tcp_socket, (struct sockaddr *)&addr, sizeof(addr));
if (ret < 0)
{
perror("连接失败\n");
return -1;
}
else
{
printf("连接成功\n");
}
// http://api.qingyunke.com/api.php?key=free&appid=0&msg=你好
// 3.发送HTTP请求协议
char *http_reques = "GET /api.php?key=free&appid=0&msg=你好 HTTP/1.1\r\nHost:api.qingyunke.com\r\n\r\n";
write(tcp_socket, http_reques, strlen(http_reques));
// 4.接收服务器应答数据
char buf[1024] = {0};
read(tcp_socket, buf, 1024);
printf("服务器返回数据%s\n", buf);
}
例子2:这是一个请求访问天气的api接口
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h> /* superset of previous */
#include <stdio.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <string.h>
int main()
{
// 1.创建TCP通信对象
int tcp_socket = socket(AF_INET, SOCK_STREAM, 0);
if (tcp_socket < 0)
{
perror("创建对象失败\n");
return -1;
}
else
{
printf("创建对象成功\n");
}
// 2.设置服务器地址信息
struct sockaddr_in addr;
addr.sin_family = AF_INET; // IPV4网络协议
addr.sin_port = htons(80); // 80 http服务器默认端口
addr.sin_addr.s_addr = inet_addr("211.101.247.139"); // 设置IP地址
int ret = connect(tcp_socket, (struct sockaddr *)&addr, sizeof(addr));
if (ret < 0)
{
perror("连接失败\n");
return -1;
}
else
{
printf("连接成功\n");
}
//https://v.api.aa1.cn/api/api-tianqi-3/index.php?msg=%E5%B9%BF%E5%B7%9E&type=1
// 3.发送HTTP请求协议
char *http_reques = "GET /api/api-tianqi-3/index.php?msg=广州&type=1 HTTP/1.1\r\nHost:v.api.aa1.cn\r\n\r\n";
write(tcp_socket, http_reques, strlen(http_reques));
// 4.接收服务器应答数据
char buf[4096] = {0};
read(tcp_socket, buf, 4096);
printf("服务器返回数据%s\n", buf);
}