【网络】http(s)协议 | content-length详解 | 转载
本文通过一个线上实例,详细介绍http协议中的content-length字段。 前言http协议是互联网中最重要的协议之一,虽然看上去很简单,但是实际中经常遇到问题,我们就已经遇到好几次了。有长连接相关的,有报文解析相关的。对http协议不能一知半解,必须透彻理解才行。 本文通过一个线上实例,详细介绍http协议中的content-length字段。 问题我们的手机App在做更新时会从服务器上下载的一些资源,一般都是一些小文件,更新的代码差不多是下面这样的: 12345678910111213141516static void update() throws IOException { URL url = new URL("http://172.16.59.129:8000/update/test.so"); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); if(conn.getResponseCode() == 200) { ...
【网络】http(s)协议 | 介绍
已经学习过自己定制一个协议了,现在就来看看当下广泛使用的http协议吧 1.介绍 超文本传输协议(Hyper Text Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。 http和https是当下最通用的协议之一,我们访问的大部分网页用的都是这个协议; 1https://www.bilibili.com/ 这两个协议主要的差别,那就是http是用明文传输数据的,我们的数据在互联网裸奔,可能有安全问题;相比之下,https传输数据的过程会对数据进行加密,但这也不代表https是完全安全的。 1.1 url要认识这两个协议,我们要从url的认识开始; HTTP(S) 不允许使用用户名或密码,一个合法的 HTTP(S) URL 格式如下: 1http(s)://<host>:<port>/<path>?<query>#<frag> 开头为协议名:http 或 https 协议;...
【网络】自定义协议 | 序列化和反序列化 | Jsoncpp
以tcpServer的计算器服务为例,实现用jsoncpp来进行序列化和反序列化 阅读本文之前,请先阅读 自定义协议 | 序列化和反序列化 | 以tcpServer为例 1.安装jsoncpp我所用的系统是centos7.6,先用下面的命令查找相关的包 1sudo yum list | grep jsoncpp-devel 显示出来的包如下 12Repository epel is listed more than once in the configurationjsoncpp-devel.x86_64 0.10.5-2.el7 @epel 随后安装这个包 1sudo yum install jsoncpp 不知道为什么,安装jsoncpp-devel.x86_64显示找不到相关包 或者采用下面的两个命令 12sudo yum install epel-releasesudo yum install...
【网络】自定义协议 | 序列化和反序列化 | 以tcpServer为例
以tcpServer的计算器服务为例,实现一个自定义协议 阅读本文之前,请先阅读 tcpServer 本文完整代码详见 Gitee 1.重谈tcp注意,当下所对tcp的描述都是以简单、方便理解起见,后续会对tcp协议进行深入解读 1.1 链接我们知道,tcp是面向连接的,客户端和服务端要先建立链接,才能开始通信 在链接过程中,tcp采用三次握手 在断线过程中,tcp采用四次挥手 举个日常生活中的栗子,帮助理解3次握手和4次挥手 1.2...
【Git】如何修改本地仓库的用户名和邮箱
最近我修改了我gitee和github的用户名还有邮箱,所以需要对本地仓库配置的用户名和邮箱进行更改 1.命令 刚开始我使用的是如下命令 12git config --global user.email "邮箱"git config --global user.name "用户名" 但是很不辛,这个命令没有用,因为它是用来初始化你的git环境的,对已有的git仓库不起作用 但是我们在linux下可以添加上另外一个参数来实现 12git config --global --replace-all user.email "邮箱" git config --global --replace-all user.name...
【Python】教你白嫖replit部署kook-ticket-bot(已失效)
教你白嫖replit部署kook的ticket机器人(已失效)
【Linux】实现守护进程 | 以tcpServer为例
本文将以tcp服务器代码为基本,讲述如何将进程守护进程化,后台运行 1.守护进程所谓守护进程,就是和其他进程没有关系的进程;其独立运行于系统后台,除非自己退出或收到信号终止,否则会一直运行下去 1.1 进程组在我们使用的bash中,同一时刻只会有一个前台进程组 如图,当一个前台进程开始运行之后,我们没有办法在当前终端开启第二个前台进程。 在运行的命令后面加&,临时让当前进程在后台运行。注意,此时tcp虽然在后台运行了, 但对于它而言,stdin/stdout/stderr的文件描述符依旧指向的是当前bash的输入输出,所以它的日志依旧会打印到当前终端上。 用ps命令查看当前进程的信息,其中ppid是当前进程的父进程,也就是当前bash,pid是进程编号,pgid是进程的组编号,可以看到这个组编号和grep命令的组编号是不同的。 我们用这个c语言的代码调用两次fork,相当于创建了3个子进程。 1234567891011#include <sys/wait.h>#include <stdlib.h>#include...
【Linux】popen pclose接口介绍
本篇文章简单讲述了c语言接口popen/pclose的用法 1.函数作用函数定义如下 1234#include <stdio.h>FILE *popen(const char *command, const char *type);int pclose(FILE *stream); popen函数会创建一个管道,fork一个子进程,关闭管道的不使用端,通过exec函数执行一个shell命令,等待命令终止。并将命令的输出结果通过管道返回给当前的进程; 1.1 popenpopen函数会创建一个管道,fork后调用shell来打开进程。由于管道的定义是单向的,第二个参数type只能指定读或写,不能同时指定读和写; 所得到的管道相应地是只读或只写的 The popen() function opens a process by creating a pipe, forking, and invoking the shell. Since a pipe is by definition unidirectional, the type argument...
【C++】using的三种用法 | 转载
C++ using的三种用法,这个之前还没有接触过 示例12345678910111213141516171819202122232425262728293031#include <iostream>using namespace std;class ClassOne {public: int w;protected: int a;};class ClassTwo{public: using ModuleType = ClassOne;};template <typename ClassType>class ClassThree : private ClassType{public: using typename ClassType::ModuleType; ModuleType m; ClassThree() = default; virtual ~ClassThree() = default;};void...
【Linux】来写一个tcp的服务端+客户端
今天让我们来写一个tcp的服务器/客户端代码 完整代码见我的gitee 连接 阅读本文前,建议先阅读👉 udp服务器 1.基本框架tcp的服务器和udp服务器初始化接口是非常相似的,区别就在于要选择字节流进行初始化 但是到运行状态就不同了 tcp是需要连接的 udp不需要连接 所以就会出现分歧:udp可以用sendto和receve来发送/接收信息,服务端只需要监听特定端口收到了什么信息; 但tcp并不能这么做,在通信之前,tcp服务器必须要和客户端建立链接。 举个不恰当的例子,udp服务器好比一个水盆,等待水的注入;而tcp服务器是个水管,必须要两头连通了,才能开始注水 1.1 类成员类的成员变量和udp很相似,都是需要服务器的ip、端口、sockfd这些信息。为了更容易区分,将tcp服务器的socket fd改为_listenSock,意为监听端口 1234567891011class TcpServer{private: // 服务器端口号 uint16_t _port; // 服务器ip地址 ...