赞
踩
协议是一种 “约定”. socket api的接口, 在读写数据时, 都是按 “字符串” 的方式来发送接收的. 如果我们要传输一些"结构化的数据" 怎么办呢?
例如, 我们需要实现一个服务器版的加法器. 我们需要客户端把要计算的两个加数发过去, 然后由服务器进行计算, 最后再把结果返回给客户端.
约定方案一:
客户端发送一个形如"1+1"的字符串;
这个字符串中有两个操作数, 都是整形;
两个数字之间会有一个字符是运算符, 运算符只能是 + ;
数字和运算符之间没有空格;
…
约定方案二:
定义结构体来表示我们需要交互的信息;
发送数据时将这个结构体按照一个规则转换成字符串, 接收到数据的时候再按照相同的规则把字符串转化回结构体;
这个过程叫做 “序列化” 和 “反序列化”
虽然我们说, 应用层协议是我们程序猿自己定的. 但实际上, 已经有大佬们定义了一些现成的, 又非常好用的应用层协议, 供我们直接参考使用. HTTP(超文本传输协议)就是其中之一。
urlencode和urldecode线上转码工具
像 / ? : 等这样的字符, 已经被url当做特殊意义理解了. 因此这些字符不能随意出现. 比如, 某个参数中需要带有这些特殊字符, 就必须先对特殊字符进行转义.转义的规则如下: 将需要转码的字符转为16进制,然后从右到左,取4位(不足4位直接处理),每2位做一位,前面加上%,编码成%XY格式
域名(Domain Name)是互联网上某一台计算机或计算机组的名称,由一串用点分隔的名字组成,用于在数据传输时标识计算机或计算机组的电子方位。人们设计域名的初衷是为了方便记忆和沟通,避免直接使用不便于记忆的IP地址数串。通过域名系统(DNS,Domain Name System),域名和IP地址可以相互映射,使得用户可以更方便地访问互联网资源。
IP地址(Internet Protocol Address)是一串数字,用于向Internet上的计算机提供标识。它与域名存在映射关系,但不同于域名,IP地址是机器直接读取的数字标识。IP地址和域名之间是一对多的关系,即一个IP地址可以对应多个域名,但一个域名通常只对应一个IP地址。
客户端(Client)则是指用户使用的电脑、手机等设备,它是用户与互联网进行交互的终端。在访问网站时,客户端(即用户的设备)会向DNS系统查询域名对应的IP地址,然后通过这个IP地址与服务器进行通信,从而获取或发送数据。
因此,域名、IP地址和客户端之间存在紧密的关系。域名提供了用户友好的访问方式,使得用户无需记住复杂的IP地址;IP地址则是互联网通信的基础,确保信息能够准确地发送到目标计算机;而客户端则是用户与互联网交互的桥梁,通过它用户可以访问网站、发送电子邮件等。这三者共同构成了互联网访问和通信的基础架构。
DNS是域名系统(Domain Name System)的缩写,是互联网的一项核心服务。DNS主要由解析器和域名服务器组成,其作用是将域名(网址)解析为IP地址,从而使人更方便地访问互联网,而无需记住机器直接读取的IP地址数串。简单来说,DNS相当于互联网上的电话簿,记录了IP地址及对应域名信息,便于用户进行查询并访问。
DNS服务器层级结构包括根域名服务器、顶级域名服务器、权限域名服务器和本地域名服务器。当用户在浏览器中输入一个域名时,本地DNS服务器会首先检查自身的缓存中是否有相应的IP地址。如果没有,它会向根域名服务器发送查询请求,然后依次通过顶级域名服务器和权限域名服务器进行解析,最终返回对应的IP地址。
DNS的架构是一个分层的分布式数据库和一组相关的协议,它定义了查询和更新数据库的机制,以及服务器之间复制数据库中信息的机制。这种设计使得主机名可以驻留在多个服务器上,从而减少了任何一台服务器上的负载,并提供了按分区管理命名系统的能力。
windows cmd :ping baidu.com得到百度的ip
:80
也可以访问知名服务器的端口一般不变
得让大家都知道才能访问你 如果变了 大家就找不到你了
http与https
HTTP和HTTPS是两种不同的网络协议,它们在多个方面存在显著差异。
首先,从安全性角度来看,HTTP使用的是明文传输,这意味着在传输过程中数据可能被截获或篡改。相反,HTTPS则通过SSL/TLS协议进行加密传输,从而保护数据在传输过程中的安全,防止数据被窃取或篡改。此外,HTTPS在连接过程中始终保持加密状态,即使连接被截断,也不会影响数据的加密状态。
其次,两者的证书管理也有所不同。HTTPS需要使用CA(证书颁发机构)颁发的证书来进行加密和解密操作,而HTTP则不需要证书。这意味着在使用HTTPS时,需要进行证书的配置。
再次,HTTP和HTTPS使用的端口号也不同。HTTP通常使用端口80,而HTTPS则使用端口443。
此外,从性能角度来看,由于HTTPS使用了加密和解密操作,因此在数据传输过程中需要消耗更多的计算资源,可能导致一些性能上的损失。
最后,从应用场景来看,HTTP协议主要用于传输HTML数据以及其他网络资源,如图片、音频、视频等。它通常被用于不需要加密传输数据的场景,如浏览网页、下载资源、使用API接口等。而HTTPS则由于其加密特性,更适用于需要保护用户隐私和数据安全的场景,如在线购物、银行交易等。
总结来说,HTTP和HTTPS各有其特点和适用场景,用户可以根据具体需求选择使用哪种协议。如需更多信息,建议查阅计算机或网络技术的专业书籍,或访问相关论坛。
URL(Uniform Resource Locator,统一资源定位符)是用于标识互联网上的资源的字符串。它提供了一种方便的方式来指定和定位互联网上的各种资源,如网页、图片、视频、文件等。URL的结构通常包括协议、域名、端口号、路径、查询字符串和片段标识符等部分。为什么具有唯一性?这是服务器某个路径下的资源!
URL的结构:
协议:指定了如何访问资源,常见的协议有http、https、ftp等。例如,http://表示使用HTTP协议进行访问。
域名:即网站的地址,是互联网上的一个唯一标识。它可以是IP地址的易记形式,如www.example.com。
端口号:指定了服务器用于接收请求的端口。大多数协议都有默认的端口号,如HTTP的默认端口是80,HTTPS的默认端口是443。如果省略端口号,浏览器会使用默认的端口号。
路径:指定了服务器上资源的具体位置。它可以是目录路径或文件名,如/index.html。
查询字符串:用于传递参数给服务器,通常跟在路径后面,并以问号(?)开始。例如,?name=John&age=30。
片段标识符:用于指定资源中的特定部分,通常用于HTML页面中的某个元素。它以井号(#)开始,如#section1。
URL的例子:
假设我们有一个网站www.example.com,它上面有一个名为index.html的页面,并且这个页面有一个名为section1的片段。同时,这个页面需要传递两个参数给服务器:name和age。那么,对应的URL可能是这样的:
http://www.example.com/index.html?name=John&age=30#section1
在这个例子中:
http:// 是协议部分,表示使用HTTP协议。
www.example.com 是域名部分。
/index.html 是路径部分,指向服务器上的具体页面。
?name=John&age=30 是查询字符串部分,用于传递参数。
#section1 是片段标识符部分,用于指定页面中的特定部分。
URL的标准化和正确构造对于网页的访问、资源的定位以及搜索引擎优化(SEO)都非常重要。错误的URL可能导致资源无法正确访问或搜索引擎无法正确索引网页内容。
通常在服务端获得的客户端请求的url只显示一部分
万维网(Web或WWW)、互联网、因特网(Internet)和以太网是网络技术中常用的术语,它们各自具有不同的含义和功能:
万维网(Web或WWW):
万维网是一个资料空间,其中的有用事物被称为“资源”,并由一个全域“统一资源标识符”(URL)来标识。
这些资源通过超文本传输协议(Hypertext Transfer Protocol)传送给使用者,使用者通过点击链接来获取这些资源。
万维网常被看作是因特网的一个服务,而不是因特网本身。尽管两者常被当作同义词使用,但实际上万维网只是互联网所能提供的服务之一。
互联网(internet):
互联网是一个庞大的网络,由多个网络相互连接而成,这些网络遵循一组通用的协议。
它始于1969年的阿帕网,并逐渐发展成为一个覆盖全球的互联网络。
互联网不仅包括万维网,还包括电子邮件、文件传输、远程登录等多种服务和应用。
因特网(Internet):
因特网是一组全球信息资源的总汇,它由一个庞大的网络互联而成,每个子网中连接着若干台计算机(主机)。
它是基于TCP/IP协议族构建的,这些协议定义了数据如何在计算机之间传输和路由。
因特网提供了各种服务,如万维网浏览、电子邮件、文件共享等。
以太网(Ethernet):
以太网是一种计算机局域网技术,是目前现实世界中最普遍的一种计算机网络。
它使用IEEE 802.3标准,定义了物理层的连线、电子信号和介质访问层协议的内容。
以太网可以是经典以太网或交换式以太网,后者使用交换机连接不同的计算机。
总结来说,这四个术语在网络技术中各有其独特的含义和角色。
万维网是基于超文本链接的全球性系统,提供网页浏览等服务;
互联网是一个由多个网络组成的庞大网络,提供了各种网络服务;
因特网是一个基于TCP/IP协议族构建的信息资源总汇;
以太网则是一种局域网技术,用于连接计算机和其他设备。
这些技术共同构成了我们今天的数字化世界。
HTTP请求和响应的格式在HTTP协议中都有明确的规定,它们通常遵循一定的结构,以确保客户端和服务器之间的正确通信。以下是HTTP请求和响应的基本格式:
存储一行 打印多行
请求行(Request Line):
请求头部(Request Headers):
User-Agent: Mozilla/5.0
Accept-Language: en-US,en;q=0.5
Content-Type: application/x-www-form-urlencoded
Content-Length: 15
请求体(Request Body):
对于某些请求方法(如POST或PUT),请求体包含要发送到服务器的数据。
数据可以是文本、JSON、XML或其他格式,取决于Content-Type头部。
区分三部分:请求行只有一行 报头和有效载荷做分离
HTTP响应通常由以下部分组成:
状态行(Status Line):
响应头部(Response Headers):
与请求头部类似,包含关于响应的元数据,如Content-Type(返回数据的类型)、Content-Length(返回数据的长度)、Set-Cookie(设置Cookie)等。
例如:
Content-Type: text/html; charset=UTF-8
Content-Length: 1234
Set-Cookie: name=value; expires=Wed, 21 Oct 2015 07:28:00 GMT
响应体(Response Body):
服务器返回给客户端的数据,如HTML页面、JSON对象、图片等。
数据的格式取决于Content-Type头部。
一个完整的HTTP请求和响应可能如下所示:
请求:
GET /example HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Connection: keep-alive
(注意:GET请求通常不包含请求体)
响应:
HTTP/1.1 200 OK
Date: Mon, 27 Jul 2020 12:28:53 GMT
Server: Apache/2.4.18 (Ubuntu)
Last-Modified: Tue, 13 Jun 2016 07:18:22 GMT
ETag: "359670651"
Accept-Ranges: bytes
Content-Length: 55
Co ntent-Type: text/html
<html>
<body>
<h1>Hello, World!</h1>
</body>
</html>
在这个示例中,客户端发送了一个GET请求到服务器的/example路径,并收到了一个包含简单HTML页面的200 OK响应。实际的HTTP请求和响应可能会更复杂,包含更多的头部和/或请求体/响应体内容。
#include <iostream>
#include <cstring>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>
// 监听端口
const int PORT = 8080;
// 解析HTTP请求的方法(需要根据HTTP协议详细实现)
void parseHttpRequest(const char *request)
{
// TODO: 解析请求行、请求头、请求体
std::cout << "Received HTTP request: " << request << std::endl;
}
// 生成HTTP响应的方法(需要根据HTTP协议详细实现)
std::string generateHttpResponse(const char *request)
{
// TODO: 根据请求内容生成响应行、响应头、响应体
std::string response = "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\n\r\nHello, World!";
return response;
}
int main()
{
const char *hello = "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\n\r\nHello, World!";
// 创建socket文件描述符
int server_fd;
if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0)
{
perror("socket failed");
exit(EXIT_FAILURE);
}
// 设置套接字选项,允许端口重用
int opt = 1;
if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt)))
{
perror("setsockopt");
exit(EXIT_FAILURE);
}
struct sockaddr_in address;
int addrlen = sizeof(address);
address.sin_family = AF_INET;
address.sin_addr.s_addr = INADDR_ANY;
address.sin_port = htons(PORT);
// 绑定socket到给定的IP地址和端口
if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0)
{
perror("bind failed");
exit(EXIT_FAILURE);
}
// 开始监听连接
if (listen(server_fd, 3) < 0)
{
perror("listen");
exit(EXIT_FAILURE);
}
std::cout << "Server is listening on port " << PORT << std::endl;
char buffer[1024] = {0};
int new_socket;
while (true)
{
// 接受一个新的连接
if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t *)&addrlen)) < 0)
{
perror("accept");
exit(EXIT_FAILURE);
}
// 读取请求数据
int valread = read(new_socket, buffer, 1024);
parseHttpRequest(buffer);
// 生成响应数据
std::string response = generateHttpResponse(buffer);
// 发送响应数据
send(new_socket, response.c_str(), response.size(), 0);
std::cout << "Sent HTTP response" << std::endl;
// 关闭连接
close(new_socket);
}
return 0;
}
Fiddler是一款强大的Web调试工具,位于客户端和服务端之间的HTTP代理。它的主要功能包括监控浏览器所有的HTTP/HTTPS流量,查看、分析请求内容细节,伪造客户端请求和服务器请求,测试网站的性能,解密HTTPS的Web会话等。此外,Fiddler还提供了全局、局部断电功能,以及支持第三方插件。
Fiddler的使用场景非常广泛,包括接口调试、接口测试、线上环境调试、Web性能分析等。它也可以用来判断全后端bug、开发环境hosts配置、mock测试以及弱网断网测试。对于开发人员来说,Fiddler特别有用。前端开发人员可以通过Fiddler代理来调试JS、CSS、HTML样式,后端开发人员则可以通过Fiddler查看请求和响应,从而定位问题。
在使用Fiddler时,用户可以通过其界面查看HTTP请求和响应的详细信息,包括请求行、请求头、请求体以及响应行、响应头、响应体等。这些信息对于分析和调试Web应用非常有帮助。
总的来说,Fiddler是一款功能强大且易于使用的Web调试工具,无论是前端还是后端开发人员,都可以通过它来提升工作效率和解决问题的能力。如果你需要下载和使用Fiddler,可以访问其官方网站进行下载,并按照提供的教程进行安装和使用。
如需更深入地了解Fiddler的使用方法和技巧,建议查阅相关的官方文档或在线教程,这些资源通常会提供更详细和具体的指导。同时,也可以参考其他开发者的经验分享,以便更好地利用Fiddler来解决实际问题。
Postman是一个接口测试工具,在做接口测试的时候,Postman相当于一个客户端,它可以模拟用户发起的各类HTTP请求,将请求数据发送至服务端,获取对应的响应结果,从而验证响应中的结果数据是否和预期值相匹配,并确保开发人员能够及时处理接口中的bug,进而保证产品上线之后的稳定性和安全性。
Postman的主要功能包括:
构建请求参数:在Postman中可以方便地设置请求的参数,包括查询参数、请求体和头部信息等。
管理环境变量:Postman允许创建和管理环境变量,以便在不同的请求中重复使用。
自动化测试集合:Postman允许创建测试集合,用于自动化测试API的各种方面。
共享和协作:Postman允许用户共享他们的API请求和测试集合给团队中的其他成员,以便共同协作。
监视API性能:Postman提供了API监视功能,可以定期发送请求并监视API。
此外,Postman还有丰富的界面功能,包括新建请求、集合、环境等,导入请求集,运行请求集,邀请团队成员协作,设置功能,查看消息和通知,管理账户等。
总的来说,Postman是一个功能强大、易于使用的接口测试工具,无论是前端还是后端开发人员,都可以通过它来提升工作效率和解决问题的能力。
wget+www.baidu.com:将百度首页的网页内容拷贝到当前index.html(自动创建)文件中
wget 是一个在命令行界面下工作的网络文件下载工具,它支持通过 HTTP、HTTPS、FTP 等协议下载文件,并可以将文件保存在本地。wget 是 “World Wide Web Get” 的缩写,字面上理解就是“从网上获取”的意思。
使用 wget 下载文件的基本语法是:
bash
wget [选项] [URL]
其中,[URL] 是你想要下载的文件的网址,[选项] 是你可以用来定制下载行为的参数。
以下是一些常用的 wget 选项:
-P, --directory-prefix=目录:指定保存文件的目录。
-r, --recursive:递归下载,下载指定 URL 下的所有文件。
-np, --no-parent:递归下载时不进入父目录。
-A, --accept=LIST:只下载 LIST 中列出的文件类型。
-R, --reject=LIST:排除 LIST 中列出的文件类型。
-l, --level=深度:递归下载的深度。
-nc, --no-clobber:如果文件已存在,则不下载新文件。
-N, --timestamping:只下载比本地文件新的文件。
-c, --continue:断点续传。
-q, --quiet:安静模式,不显示下载信息。
-O, --output-document=文件:将文件保存到指定名称。
–limit-rate=速率:限制下载速度。
这只是 wget 的一部分选项,实际上它还有许多其他功能和选项。你可以通过 man wget 或 wget --help 命令查看完整的帮助文档和选项列表。
例如,如果你想下载一个名为 example.zip 的文件,并将其保存到本地的 downloads 文件夹中,你可以使用以下命令:
bash
wget -P downloads http://example.com/example.zip
HTTP中的GET和POST方法都是用于向服务器发送请求的基本HTTP方法,但它们之间存在一些重要的区别。以下是它们之间的主要区别与联系:
区别:
请求的目的:
GET方法主要用于请求数据。它通常用于从服务器检索信息,例如获取网页内容或查询数据库。
POST方法主要用于提交数据。它通常用于向服务器发送数据,例如提交表单数据或上传文件。
安全性:
GET请求的参数直接附加在URL后面,并且可以在浏览器的历史记录、网络日志等地方被看到,因此不适合传输敏感信息。
POST请求的参数在请求体中,不会在URL中显示,相对更安全一些。但请注意,仅仅使用POST并不足以保证安全性,还需要其他安全措施(如HTTPS)来确保数据在传输过程中的安全。
post只是相对安全,因为它不会直接显示在url后,实际上二者都不安全,安全问题需要加密----https中会讲
缓存:
GET请求可以被缓存,而POST请求则不会。这意味着如果你多次发送相同的GET请求,浏览器或代理服务器可能会返回缓存的结果,而不是每次都从服务器获取新数据。
数据长度限制:
GET请求由于将参数附加在URL中,因此受到URL长度的限制。不同的浏览器和服务器对URL长度有不同的限制,但通常都不建议过长。
POST请求没有这样的限制,因为数据是放在请求体中的。
幂等性:
GET请求是幂等的,意味着多次执行相同的GET请求应该具有相同的效果(没有副作用)。
POST请求不是幂等的,每次执行都可能有不同的效果(例如,提交表单数据可能会创建新的资源)。
联系:
都是HTTP方法:GET和POST都是HTTP协议中定义的方法,用于与Web服务器进行通信。
都使用HTTP协议:无论是GET还是POST请求,它们都遵循HTTP协议的规定,包括请求行、请求头、请求体等结构。
都可以包含请求头和请求体:虽然GET请求通常不包含请求体(除非使用了某些特殊技术,如查询字符串),但两者都可以包含请求头,用于传递额外的信息,如认证信息、内容类型等。
都可以用于Web开发:在Web开发中,GET和POST都是常用的HTTP方法,用于实现各种功能,如页面跳转、表单提交、数据查询等。
总的来说,GET和POST在HTTP协议中扮演着不同的角色,具有不同的用途和特点。在选择使用哪种方法时,应根据具体的应用场景和需求来决定。
在Web开发中,action=“/s” 通常出现在HTML表单的 标签中,用于指定当表单提交时数据应该发送到的URL。这里的 /s 通常是一个相对于当前URL的路径,表示表单数据应该被发送到服务器上的 /s 这个路径。
例如:
html
在这个例子中,当用户填写表单并点击“Submit”按钮时,浏览器会创建一个HTTP POST请求,并将表单中的数据发送到服务器的 /s 路径。服务器上的某个处理程序(通常是一个Web应用框架中的视图函数或控制器方法)会处理这个请求,并根据需要执行相应的操作,比如验证用户输入、存储数据等。需要注意的是,/s 这个路径是相对于当前页面的URL的。如果当前页面的URL是 http://example.com/home,那么表单数据将会发送到 http://example.com/s。如果当前页面在子目录下,比如 http://example.com/subdir/page,那么实际发送的URL将会是 http://example.com/subdir/s,除非使用了绝对路径。
此外,method=“post” 指定了HTTP请求的方法为POST,这意味着表单数据将作为请求体发送,而不是附加在URL后面(像GET请求那样)。使用POST方法通常用于提交可能包含敏感信息(如密码)的表单,因为POST请求不会在浏览器的历史记录或网络日志中留下明显的痕迹。
403:没有访问资格/权限
5xx: 服务线程创建错误,连接数据库错误
301:(永久移动) 请求的网页已永久移动到新位置。 服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。
302:(临时移动) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
303:(查看其他位置) 请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码。
304:(未修改) 自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容。
305:(使用代理) 请求者只能使用代理访问请求的网页。 如果服务器返回此响应,还表示请求者应使用代理。
307:(临时重定向) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
308:(永久转移)这个请求和以后的请求都应该被另一个URI地址重新发送。307、308和302、301有相同的表现,但是不允许HTTP方法改变。例如,请求表单到一个永久转移的资源将会继续顺利地执行。
浏览器向服务器发送了一个请求,但是服务器由于某种原因无法向浏览器提供这种服务,服务器返回了一个状态码和新的地址,告知浏览器可以通过新的地址,去找到他想要的东西。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。