当前位置: 首页 > news >正文

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);
}

相关文章:

  • c++进阶之----c++11(可变参数模板)
  • 学习计划:从MCP入门到项目构建的全面指南
  • Vue.js 中 v-show 的使用及其原理
  • C++ -异常之除以 0 问题(整数除以 0 编译时检测、整数除以 0 运行时检测、浮点数除以 0 编译时检测、浮点数除以 0 运行时检测)
  • 0.机器学习基础
  • SpringBoot整合MinIO快速入门:实现分布式文件存储与管理
  • QTSql全解析:从连接到查询的数据库集成指南
  • LCR 056. 两数之和 IV - 输入二叉搜索树
  • 工业4.0时代,RK3562工控机为何成为智慧工位首选?
  • PostgreSQL的内存管理机制
  • 《Operating System Concepts》阅读笔记:p587-p596
  • 弹簧质点系统(C++实现)
  • 平均标准差策略思路
  • CExercise_07_1指针和数组_1编写函数交换数组中两个下标的元素
  • 谈谈模板方法模式,模板方法模式的应用场景是什么?
  • LLM+js实现大模型对话
  • 判断矩阵A是否可以相似对角化
  • MySQL 在 CentOS 7 环境安装完整步骤
  • 任务调度和安全如何结合
  • WinMerge下载及使用教程(附安装包)
  • 上海发布首份直播电商行业自律公约,禁止虚假宣传、商业诋毁
  • 《中国人民银行业务领域数据安全管理办法》发布,6月30日起施行
  • “降息潮”延续!存款利率全面迈向“1时代”
  • 看展览|2025影像上海艺博会:市场与当代媒介中的摄影
  • 独家丨刘家琨获普利兹克奖感言:守护原始的感悟力
  • 中华人民共和国和俄罗斯联邦在纪念中国人民抗日战争、苏联伟大卫国战争胜利和联合国成立80周年之际关于进一步深化中俄新时代全面战略协作伙伴关系的联合声明