网络编程(UDP/TCP)

2023-05-16

1.网络模型

 

数据从网络中一个终端上的应用程序传送到另外一个终端的应用程序,中间需要经历很多过程,有多方参与对数据进行层层封装、转发。我们把这个流程在逻辑上进行分层,每一层根据本层的规章制度(协议)各司其职。TCP/IP协议族可以分为四层:应用层传输层网络层数据链路层。   

        1> 应用层协议

                与网络相关的程序通过网络与其他程序通信使用的数据格式规范。比如浏览器向服务器发请求获取网页数据,此时发送的请求报文(皇室信件)就需要遵循HTTP协议(按HTTP协议的要求填写字段)。常见的应用层协议有:

  • HTTP(80端口),主要用于普通浏览。

  • HTTPS(443端口),HTTP协议的安全版本。

  • FTP(20和21端口),用于文件传输。

  • POP3(110端口),收邮件用。

  • SMTP(25端口),用来发送电子邮件。

  • SSH(22端口),用于加密安全登陆用。

  • DHCP(67端口,动态主机配置协议),动态配置IP地址。

  • DNS,用于完成地址查找,邮件转发等工作(运行在TCP和UDP协议上)。

  • SNMP,用于网络信息的收集和网络管理。

  • ARP,用于动态解析以太网硬件的地址。

        2> 传输层协议(解决诸如端到端可靠性(数据是否已经到达目的地)和保证数据按照正确的顺序到达这样的问题。TCP、UDP都是传输层协议) 

        3> 网络层协议(解决在一个单一网络上传输数据包的问题。IP协议是网络层协议)

        4> 数据链路层协议 (它是数据包从一个设备的网络层传输到另外一个设备的网络层遵循的规范。比如以太网协议、Wi-Fi协议)

2.IP介绍

 在互联网中,一台主机只有一个IP地址。 IP地址用于在TCP/IP通信协议中标记每台计算机的地址,通常用于十进制来表示,如192.168.1.100,但是在计算机内部,IP地址是一个32位的二进制数值,如11000000 10101000 00000001 00000110(192.168.1.6)。 具体来讲,一个完整的IP地址信息应该包括IP地址、子网掩码、默认网关和DNS等四部分。只有这四部分协同工作,才能与互联网中的计算机相互访问。

        1> IP地址(一个完整的IP地址由两部分组成,分别是网络号部分和主机号部分。网络号表示其所属的网络段编码,主机号则表示该网段中该主机的地址编码。 按照网络规模的大小,IP地址可以分为A、B、C、D、E五类,其中A、B、C类是3种主要的类型地址,D类地址用于多点广播,E类用于扩展备用地址)

                (1).A类IP地址:

                        一个A类IP地址由1个字节的网络地址和3个字节的主机地址组成,网络地址的最高位必须是"0",地址范围从1.0.0.0~126.0.0.0。

                (2).B类IP地址:

                        一个B类IP地址由2个字节的网络地址和2个字节的主机地址组成,网络地址的最高位必须是"10",地址范围从128.0.0.0~191.255.255.255。

                (3).C类IP地址:

                        一个C类IP地址由3个字节的网络地址和1个字节的主机地址组成,网络地址的最高位必须是"110",地址范围从192.0.0.0~223.255.255.255。

                (4).D类IP地址:

                        用于多点广播(Multicast)。D类IP地址第一个字节以"10"开始,它是一个专门保留的地址;它并不指向特定的网络,目前这一类地址被用在多点广播中。多点广播地址用来依次寻址一组计算机,它标识共享同一协议的一组计算机。

                (5).E类IP地址:

                        以"10"开始,为将来使用保留,全"0"(0.0.0.0)IP地址对应于当前主机;全"1"的IP地址(255.255.255.255)是当前子网的广播地址。

        2> 子网掩码(子网掩码是与IP地址结合使用的一种技术)

                主要作用有两个:1)用于确定IP地址中的网络号和主机号;2)用于将一个大的IP网络划分为若干小的子网络。

        3> 默认网关(默认网关意为一台主机如果找不到可用的网关,就把数据包发送给默认指定的网关,由这个网关来处理数据包)

        4>DNS(DNS服务器用于将用户的域名请求转换为IP地址)

算机的IP地址一旦被分配,可以说是固定不变的。 【命令行提示符】窗口中输入"ipconfig",按Enter键,即可显示出本机的IP配置相关信息。

3.端口介绍

        1> 端口的分类按端口号来说,可以分为三大类:公认端口、注册端口、动态和/或私有端口

                1)公认端口(公认端口的区间为0~1023,这种端口紧密绑定于一些服务。例如,80端口就总是HTTP通信。)

                2) 注册端口(注册端口的区间为1024~49151,这种端口松散绑定于一些服务。可以解释为,有许多服务绑定于这些端口,但同样这些端口用于许多其他目的。例如,许多动态处理端口从1024左右开始)

                3) 动态/私有端口(动态和/或私有端口的区间为49152~65535,理论上,不应为服务分配这些端口;实际上,机器通常从1024起分配动态端口。也有一些特例,比如,SUN的RPC端口从32768开始)

        2> 常见的端口号及其功能

                1)80端口号(80端口是为HTTP协议开放的,是HTTP协议的默认端口,用于网页浏览。在输入网站时,用户输入百度一下,你就知道,其实是访问百度一下,你就知道,因为位于网址后端的端口号是由浏览器自动补全的)

                2)8080端口号(8080端口,经常在访问某个网站或使用代理服务器的时候用得到,主要还是用于代理服务)

                3)21端口号(21端口主要用于文件传输协议(FTP)服务,是FTP的默认端口。用于传输控制信息(而20端口可能同样会在FTP中用到,只不过20端口用到时只用于传输数据)。 注:文件传输协议(FTP):主要是为了在两台计算机之间实现文件的上传与下载)

                4)23端口号(23端口是telnet(远程登录)的端口,是Internet上普遍采用的登录和仿真程序,主要用于远程登录。 注:Telnet协议:是TCP/IP协议族中的一员,是Internet远程登录服务的标准协议和主要方式)

在终端使用者的电脑上使用telnet程序,用它连接到服务器。终端使用者可以在telnet程序中输入命令,这些命令会在服务器上运行,就像直接在服务器的控制台上输入一样。可以在本地就能控制服务器。要开始一个telnet会话,必须输入用户名和密码来登录服务器。

                5)25端口号(25端口为简单邮件传输协议(SMTP)服务器所开放,主要用于发送邮件。   注:简单邮件传输协议(SMTP):一种提供可靠且有效的电子邮件传输的协议) 

                6)53端口号(53端口为域名系统服务协议(DNS)服务器所开放,主要用于域名解析。通过DNS服务器可以实现域名与IP地址之间的转换,只要记住域名就可以快速访问网站。域名系统服务协议   注:域名系统服务协议(DNS):用于域名与 IP 地址的相互转换,以及控制因特网的电子邮件的发送)

4.UDP编程

         1> 不同电脑之间的进程如何通信

                首要解决的问题是如何唯一标识一个进程,否则通信无从谈起!在1台电脑上可以通过进程号(PID)来唯一标识一个进程,但是在网络中这是行不通的。其实TCP/IP协议族已经帮我们解决了这个问题,网络层的“ip地址”可以唯一标识网络中的主机,而传输层的“协议+端口”可以唯一标识主机中的应用进程(进程)。这样利用ip地址,协议,端口就可以标识网络的进程了,网络中的进程通信就可以利用这个标志与其它进程进行交互

        2> 什么是套接字

                socket(简称套接字) 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的. 例如我们每天浏览网页、QQ 聊天、收发 email 等等

        3> 创建套接字

                在 Python 中 使用socket 模块的函数 socket 就可以完成:

                函数 socket.socket 创建一个 socket,该函数带有两个参数:

                1)Address Family:可以选择 AF_INET(用于 Internet 进程间通信) 或者 AF_UNIX(用于同一台机器进程间通信),实际工作中常用AF_INET

                2)Type:套接字类型,可以是 SOCK_STREAM(流式套接字,主要用于 TCP 协议)或者 SOCK_DGRAM(数据报套接字,主要用于 UDP 协议)

import socket
socket.socket(AddressFamily, Type)

                创建一个tcp socket(tcp套接字)

import socket

# 创建tcp的套接字
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# ...这里是使用套接字的功能(省略)...

# 不用的时候,关闭套接字
s.close()

                创建一个udp socket(udp套接字)

import socket

# 创建udp的套接字
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# ...这里是使用套接字的功能(省略)...

# 不用的时候,关闭套接字
s.close()

套接字使用流程 与 文件的使用流程很类似:1)创建套接字,2)使用套接字收/发数据,3)关闭套接字

        4> 实现网络调试助手(可以下载一个网络调试助手)的UDP通信(UDP则是面向无连接的协议)

                数据包就是这种形式。比如:短信。只要数据发送出去, 无需去管对方是否接收到。使用UDP协议时,不需要建立连接,只需要知道对方的IP地址和端口号,就可以直接发数据包。但是,能不能到达就不知道了。虽然用UDP传输数据不可靠,但它的优点和TCP比,速度快,对于不要求可靠到达的数据,就可以使用UDP协议。 创建一个基于udp的网络程序流程很简单,具体步骤如下:1)创建客户端套接字,2)发送/接收数据,3)关闭套接字

        5> 实现UDP双端通信

                1)UDP网络程序---发送数据

from socket import *

# 1. 创建udp套接字
udp_socket = socket(AF_INET, SOCK_DGRAM)

# 2. 准备接收方的地址
# '192.168.1.103'表示目的ip地址
# 8080表示目的端口
dest_addr = ('192.168.1.103', 8080)  # 注意 是元组,ip是字符串,端口是数字

# 3. 从键盘获取数据
send_data = input("请输入要发送的数据:")

# 4. 发送数据到指定的电脑上的指定程序中
udp_socket.sendto(send_data.encode('utf-8'), dest_addr)

# 5. 关闭套接字
udp_socket.close()

                2)UDP网络程序---发送,接收数据

from socket import *

# 1. 创建udp套接字
udp_socket = socket(AF_INET, SOCK_DGRAM)

# 2. 准备接收方的地址
dest_addr = ('192.168.236.129', 8080)

# 3. 从键盘获取数据
send_data = input("请输入要发送的数据:")

# 4. 发送数据到指定的电脑上
udp_socket.sendto(send_data.encode('utf-8'), dest_addr)

# 5. 等待接收对方发送的数据
recv_data = udp_socket.recvfrom(1024)  # 1024表示本次接收的最大字节数

# 6. 显示对方发送的数据
# 接收到的数据recv_data是一个元组
# 第1个元素是对方发送的数据
# 第2个元素是对方的ip和端口
print(recv_data[0].decode('gbk'))
print(recv_data[1])

# 7. 关闭套接字
udp_socket.close()

                3)UDP通信代码实现

                说明:--- 每重新运行一次网络程序,上图中红圈中的数字,不一样的原因在于,这个数字标识这个网络程序,当重新运行时,如果没有确定到底用哪个,系统默认会随机分配
---记住一点:这个网络程序在运行的过程中,这个就唯一标识这个程序,所以如果其他电脑上的网络程序如果想要向此程序发送数据,那么就需要向这个数字(即端口)标识的程序发送即可。

一般情况下,在一台电脑上运行的网络程序有很多,为了不与其他的网络程序占用同一个端口号,往往在编程中,udp的端口号一般不绑定

但是如果需要做成一个服务器端的程序的话,是需要绑定的,想想看这又是为什么呢?

如果报警电话每天都在变,想必世界就会乱了,所以一般服务性的程序,往往需要一个固定的端口号,这就是所谓的端口绑定        

from socket import *

# 1. 创建套接字
udp_socket = socket(AF_INET, SOCK_DGRAM)

# 2. 绑定本地的相关信息,如果一个网络程序不绑定,则系统会随机分配
local_addr = ('', 7788) #  ip地址和端口号,ip一般不用写,表示本机的任何一个ip
udp_socket.bind(local_addr)

# 3. 等待接收对方发送的数据
recv_data = udp_socket.recvfrom(1024) #  1024表示本次接收的最大字节数

# 4. 显示接收到的数据
print(recv_data[0].decode('gbk'))

# 5. 关闭套接字
udp_socket.close()

5.TCP编程

        1> TCP通信流程

                TCP协议,传输控制协议(英语:Transmission Control Protocol,缩写为 TCP)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。

                TCP通信需要经过创建连接、数据传送、终止连接三个步骤。TCP通信模型中,在通信开始之前,一定要先建立相关的连接,才能发送数据,类似于生活中,"打电话"。这种连接是一对一的,因此TCP不适用于广播的应用程序,基于广播的应用程序请使用UDP协议。

        2> 三次握手和四次挥手

                TCP的三次握手(建立连接)和四次挥手(关闭连接)

                        1.SYN(synchronous建立联机)2.ACK(acknowledgement 确认)3.PSH(push传送)4.FIN(finish结束)5.RST(reset重置)6.URG(urgent紧急)

                        在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接

                        (1) 第一次握手:建立连接时,客户端A发送SYN包(SYN=j)到服务器B,并进入SYN_SEND状态,等待服务器B确认。(2) 第二次握手:服务器B收到SYN包,必须确认客户A的SYN(ACK=j+1),同时自己也发送一个SYN包(SYN=k),即SYN+ACK包,此时服务器B进入SYN_RECV状态。(3) 第三次握手:客户端A收到服务器B的SYN+ACK包,向服务器B发送确认包ACK(ACK=k+1),此包发送完毕,客户端A和服务器B进入ESTABLISHED状态,完成三次握手。完成三次握手,客户端与服务器开始传送数据:

                        采用四次挥手关闭连接:由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这个原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。(1)客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送。(2)服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。(3)服务器B关闭与客户端A的连接,发送一个FIN给客户端A。(4)客户端A发回ACK报文确认,并将确认序号设置为收到序号加1。

        3> 实现网络调试助手与TCP服务端的通信

from socket import *

# 创建socket
tcp_client_socket = socket(AF_INET, SOCK_STREAM)

# 目的信息
server_addr = ('192.168.64.1', 8080)
# 链接服务器
tcp_client_socket.connect(server_addr)

# 提示用户输入数据
send_data = input("请输入要发送的数据:")

tcp_client_socket.send(send_data.encode("utf-8"))

# 接收对方发送过来的数据,最大接收1024个字节
recvData = tcp_client_socket.recv(1024)
print('接收到的数据为:', recvData.decode('utf-8'))

# 关闭套接字
tcp_client_socket.close()

        4> 实现TCP双端通信(作为服务端要先启动)

                如同上面的电话机过程一样,在程序中,如果想要完成一个tcp服务器的功能,需要的流程如下:    

  • socket创建一个套接字

  • bind绑定ip和port

  • listen使套接字变为可以被动链接

  • accept等待客户端的链接

  • recv/send接收发送数据 

from socket import *

# 创建socket
tcp_server_socket = socket(AF_INET, SOCK_STREAM)

# 本地信息
address = ('', 7788)

# 绑定
tcp_server_socket.bind(address)

# 使用socket创建的套接字默认的属性是主动的,使用listen将其变为被动的,这样就可以接收别人的链接了
tcp_server_socket.listen(128)

# 如果有新的客户端来链接服务器,那么就产生一个新的套接字专门为这个客户端服务
# client_socket用来为这个客户端服务
# tcp_server_socket就可以省下来专门等待其他新客户端的链接
client_socket, clientAddr = tcp_server_socket.accept()

# 接收对方发送过来的数据
recv_data = client_socket.recv(1024)  # 接收1024个字节
print('接收到的数据为:', recv_data.decode('gbk'))

# 发送一些数据到客户端
client_socket.send("thank you !".encode('gbk'))

# 关闭为这个客户端服务的套接字,只要关闭了,就意味着为不能再为这个客户端服务了,如果还需要服务,只能再次重新连接
client_socket.close()

tcp注意点:

  1. tcp服务器一般情况下都需要绑定,否则客户端找不到这个服务器

  2. tcp客户端一般不绑定,因为是主动链接服务器,所以只要确定好服务器的ip、port等信息就好,本地客户端可以随机

  3. tcp服务器中通过listen可以将socket创建出来的主动套接字变为被动的,这是做tcp服务器时必须要做的

  4. 当客户端需要链接服务器时,就需要使用connect进行链接,udp是不需要链接的而是直接发送,但是tcp必须先链接,只有链接成功才能通信

  5. 当一个tcp客户端连接服务器时,服务器端会有1个新的套接字,这个套接字用来标记这个客户端,单独为这个客户端服务

  6. listen后的套接字是被动套接字,用来接收新的客户端的链接请求的,而accept返回的新套接字是标记这个新客户端的

  7. 关闭listen后的套接字意味着被动套接字关闭了,会导致新的客户端不能够链接服务器,但是之前已经链接成功的客户端正常通信。

  8. 关闭accept返回的套接字意味着这个客户端已经服务完毕

  9. 当客户端的套接字调用close后,服务器端会recv解堵塞,并且返回的长度为0,因此服务器可以通过返回数据的长度来区别客户端是否已经下线

6.HTTP协议

        1> 浏览器访问服务器的过程

 

1.用户输入网址.2.浏览器请求DNS服务器, 获取域名对应的IP地址.3.请求连接该IP地址服务器.4.发送资源请求. (HTTP协议)5.web服务器接收到请求, 并解析请求, 判断用户意图.6.获取用户想要的资源.7.将资源返回给web服务器程序.8.web服务器程序将资源数据通过网络发送给浏览器.9.浏览器解析请求的数据并且完成网页数据的显示.

        2> 域名和DNS 

                我们在访问一台服务器的时候, 需要记住该服务器的IP地址, 由于IP地址不利于人们记忆, 所以推出的域名技术. 域名是由一串用点分隔的名字组成的 Internet 上某一台计算机或计算机组的名称, 用于在数据传输时标识计算机的位置。域名可以用来表示一个单位、机构或可以利用个人在 Internet上 的确定的名称或位置. 域名是惟一的. 客户可以利用这个名字找寻有关的产品和服务信息。由于我们用域名来标识计算机的位置, 但是我们前面讲过, 网络上标识主机的唯一标识是IP地址, 所以就需要记录一下, 一个域名和IP地址的对应关系, 这个对应关系就存储在DNS服务器中, 当我们向 DNS 发出请求时,DNS会返回给我们域名所对应的IP地址.

        3> HTTP介绍(超文本传输协议,是一个基于请求与响应,无状态的,应用层的协议,常基于TCP/IP协议传输数据,互联网上应用最为广泛的一种网络协议,所有的WWW文件都必须遵守这个标准。设计HTTP的初衷是为了提供一种发布和接收HTML页面的方法)

HTTP发展历史
版本产生时间内容发展现状
HTTP/0.91991年不涉及数据包传输,规定客户端和服务器之间通信格式,只能GET请求没有作为正式的标准
HTTP/1.01996年传输内容格式不限制,增加PUT、PATCH、HEAD、 OPTIONS、DELETE命令正式作为标准
HTTP/1.11997年持久连接(长连接)、节约带宽、HOST域、管道机制、分块传输编码2015年前使用最广泛
HTTP/22015年多路复用、服务器推送、头信息压缩、二进制协议等逐渐覆盖市场

超文本传输协议(HTTP)是万维网应用层的协议,是通过两个程序实现:

  • 一个是客户端程序(一般称为浏览器)

  • 另一个是服务器 (常称Web服务器)

这两个通常运行在不同的主机上,通过交换HTTP报文来完成网页请求响应;并且HTTP定义了报文的结构和客户/服务器之间交换报文的规则

 HTTP请求报文格式

HTTP报文是面向文本的,报文中的每一个字段都是一些ASCII码串,各个字段的长度是不确定的。HTTP有两类报文:请求报文和响应报文。

一个HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据4个部分组成

        1> 请求行

                请求行由请求方法字段,url字段(请求资源路径)和HTTP协议版本字段3个字段组成,它们用空格隔开,例:GET /login.html HTTP/1.1

                HTTP协议请求方法有GET,POST,PUT,DELETE,HEAD,OPTIONS,TRACE,CONNECT。

                常见的请求方法.GET(没有请求体,只有请求行,请求头和空行组成)

---- 请求行 ----
GET / HTTP/1.1  # GET请求方式 请求资源路径 HTTP协议版本
---- 请求头 -----
Host: www.baidu.com  # 服务器的主机地址和端口号,默认是80
Connection: keep-alive # 和服务端保持长连接
Upgrade-Insecure-Requests: 1 # 让浏览器升级不安全请求,使用https请求
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36  # 用户代理,也就是客户端的名称
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8 # 可接受的数据类型
Accept-Encoding: gzip, deflate # 可接受的压缩格式
Accept-Language: zh-CN,zh;q=0.9 #可接受的语言
Cookie: pgv_pvi=1246921728; # 登录用户的身份标识

---- 空行 ----

                .POST(请求行,请求头,空行,请求体组成)

---- 请求行 ----
POST /v2/api/?login HTTP/1.1 # POST请求方式 请求资源路径 HTTP协议版本
---- 请求头 ----
Host: passport.baidu.com # 服务器的主机地址和端口号,默认是80
Connection: keep-alive # 和服务端保持长连接
Content-Type: application/x-www-form-urlencoded  # 告诉服务端请求的数据类型
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36 # 客户端的名称
---- 空行 ----
---- 请求体 ----
username=hello&pass=hello # 请求参数

        2> 请求头

                有关键字/值对组成,每行一对,关键字和值用冒号隔开请求头通知服务器有关客户端请求的信息:

                User-Agent:产生请求的客户端信息浏览器类型,Accept:客户端可识别的内容类型列表,Host:请求的主机名,容许多个域名同处一个IP地址。即虚拟主机

        3> 请求体(携带数据)

HTTP响应报文格式(响应行,响应头,响应体)

        1> 响应行 例如:HTTP-Version Status-Code Reason-Phrase CRLF

其中,HTTP-Version表示服务器HTTP协议的版本;Status-Code表示服务器发回的响应状态代码;Reason-Phrase表示状态代码的文本描述。状态代码由三位数字组成,第一个数字定义了响应的类别,且有五种可能取值。

响应报文说明:

--- 响应行/状态行 ---
HTTP/1.1 200 OK # HTTP协议版本 状态码 状态描述
--- 响应头 ---
Server: Tengine # 服务器名称
Content-Type: text/html; charset=UTF-8 # 内容类型
Transfer-Encoding: chunked # 发送给客户端内容不确定内容长度,发送结束的标记是0\r\n, Content-Length表示服务端确定发送给客户端的内容大小,但是二者只能用其一。
Connection: keep-alive # 和客户端保持长连接
Date: Fri, 23 Nov 2018 02:01:05 GMT # 服务端的响应时间
--- 空行 ---
--- 响应体 ---
<!DOCTYPE html><html lang=“en”> …</html> # 响应给客户端的数据

状态码:

        1xx-->指示信息--代表请求已经接收,继续处理

        2xx-->成功--请求已经成功,理解,接受

        3xx-->重定向--要求完成请求需要更进一步的操作

        4xx-->客户端错误--请求语法错误,或请求无法实现

        5xx-->服务器端错误--服务器未能实现合法的请求

        常见状态码:

                200:客户端请求成功

                301:永久重定向

                302:临时重定向

                400:错误请求

                401:未授权

                403:禁止访问

                404:未找到

                405:请求方式有误

                500:服务器内部错误

                501:未实现

                502:错误网关

                504:网关超时

                505:HTTP版本不支持

        2> 响应头

                用于描述服务器的基本信息,以及数据的描述,服务器通过这些数据的描述信息,可以通知客户端如何处理响应数据

        3>响应体

                就是响应时的消息体,数据可以市普通文本,XML,JSON,HTML源码等

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

网络编程(UDP/TCP) 的相关文章

  • 十六进制转十进制(c语言)

    输入的十六进制数 xff0c 通过字符型存放在a 数组中 首先将字符型转为int型 xff08 将a转为10等等 xff09 存放在b 数组中 在与10 n相乘在相加得出结果 include lt stdio h gt include lt
  • 对视频图像进行OSD叠加

    频叠加就是将图片和文字信息叠加到视频信号中 xff0c 如电视台的LOGO xff0c 电影的字幕 xff0c 电视机的菜单 xff0c 都是通过视频叠加的形式显示在视频图像中的 区别于用于专业影视编辑行业的字幕叠加器 xff0c 字符叠加
  • VS2019 C#开发手机App环境配置和开发

    参考链接 xff1a https www dianyuan com eestar article 1284 html 上位机开发人员 xff0c 想开发APP xff0c 从头学Java xff0c 需要花的时间成本太大 xff0c 最近网
  • 华为手机通过ADB禁止系统更新和卸载自带软件

    参考链接 xff1a 电源网 刚买华为手机最烦的是每天都提示系统更新 xff0c 就算设置不提醒 xff0c 过两天又开始提醒 xff0c 不死不休 xff0c 最后还是一次手误最终还是让它得逞了 xff0c 自动更新了 xff0c 下面就
  • C#利用Socket实现C/S模式通信

    参考链接 xff1a https www dianyuan com eestar article 1330 html 首先我们要了解一下几点内容 xff1a 1 Tcp IP协议是什么 xff1f 2 Socket是什么 xff1f 3 s
  • OpenCV 图像处理 灰度化、二值化与加噪

    参考链接 xff1a https www dianyuan com eestar article 1414 html 因为要自动检测裂缝 xff0c 就考虑到了图像的二值化处理 xff0c 虽然C 可以实现二值化处理 xff0c 但是是逐个
  • ROC-RK3328-CC 开发板开箱和上手指南

    参考链接 xff1a https www dianyuan com eestar article 1424 html RK3328处理器采用了64位A53架构四核处理器 xff0c 主频为1 5GHz xff0c GPU则采用了Mali 4
  • C#中AForge库调节视频亮度、饱和度等属性

    参考链接 xff1a https www dianyuan com eestar article 1479 html 之前工作中需要调节摄像头的亮度 饱和度调节 xff0c 之前一直通过调用AForge的调节控件才能调节 xff0c 虽然可
  • Ubuntu下安装和配置Qtcreator5.15版本

    Qt选择 在官方的声明中 xff0c Qt5 15是Qt5 x的最后一个LTS版本 xff0c 增加了即将在2020年底推出的Qt6的部分新特性 xff0c 为了之后的新版本有更好的兼容性 xff0c 选择了Qt5 15 下载Qt 对于普通
  • python 获取文件夹下的文件名操作(两种)

    一 相对路径 文件存储的想对路径路径 path 61 39 data 0 39 os walk 是一个生成器 xff0c 返回三个值 xff1a 根目录 xff0c 根目录下的目录和文件列表 folder 61 os walk path 3
  • 1、串口(UART/COM/TTL/RS232/RS485)

    目录 串口简介 串行通讯制式 UART 2 1 简介 2 2 电平标准 TTL RS232 RS485 2 3 电平转换 xff08 重点讲解RS232 TTL xff09 USB转TTL USB转RS232 USB转RS485 RS232
  • 集成Python和QML

    Qt包括QML作为一种声明性地描述用户界面并使用JavaScript作为其中的脚本语言的手段 可以编写完整的独立QML应用程 序 xff0c 或将它们与C 43 43 结合使用 PyQt5允许QML以完全相同的方式与Python集成 特别是
  • 个人小型管理服务器 SVN的安装和使用方法

    1 下载TortoiseSVN客户端 官网下载地址 Downloads TortoiseSVN 注意下载跟你电脑位数匹配 64位 32位 的安装包 在页面的下面你还可以找到语言包 如图 下载完成后 应该有这些安装包 如图 接下来我们安装To
  • Ubuntu20.04下安装QtCreator 5.14.2(安装/卸载/创建快捷键/添加收藏)

    原文链接 xff1a https www dianyuan com eestar article 2864 html 都是自己原创 xff0c 发这里提高下知名度 xff0c 也帮助需要的人 一 Qt和Qt Creator的区别 Qt是C
  • WPF中自定义双滑块Slider

    项目中遇到需要双滑块的情况 xff0c 可以网上的基本都是单滑块的样式和例子 xff0c 但是双滑块的很少 xff0c 后来终于在网上找到一个大神的帖子 xff0c 通过修改和完善终于符合自己的需求 xff0c 可后来再查看代码的时候好像又
  • C#通过API对硬件进行禁用和启用

    慢慢的随着年龄的增长 xff0c 脑子越来越不够用 xff0c 而自己的收藏栏也越来越杂乱 xff0c 虽然现在的网上要啥都有 xff0c 但是没有经过自己亲手实验和整理总结 xff0c 下次需要的时候一切又要从头开始 xff0c 而电子星
  • Ubuntu下如何获取usb相机的PID/VID并打开指定的相机

    项目需求控制和打开两个USB摄像头 xff0c 并且根据相机的PID和VID来打开指定的相机 xff0c 来区分主副相机 xff0c 在Windows下可以通过AForge Video DirectShow库来实现 xff0c 但是Ubun
  • ubuntu在arm平台下编译安装opencv(亲测可用)

    X86平台安装很多软件一句话就可以搞定 xff0c 非常方便 xff0c 但是在arm平台一个简单的软件安装起来都非常费尽 xff0c 一个软件安装就要折腾好几天 下面就把安装opencv的过程记录下来 一 通过pip安装opencv xf
  • ubuntu在arm平台下编译安装Qt5.15.2和PySide2(亲测可用)

    一 安装Qt5 15 2 1 下载源码首先在官网下载Qt5 15 2的源码 xff1a https download qt io archive qt 5 15 5 15 2 single 2 先安装编译qt的环境 sudo apt get
  • ubuntu20.04安装cmake详细教程

    一 命令行安装 xff08 这种直接安装cmake xff0c 其实安装的版本都太老了 xff0c 这种方式不推荐 xff09 sudo apt install cmake 二 Cmake源码编译安装 1 更新一下g 43 43 已经安装请

随机推荐

  • ubuntu20.04编译安装qt5.14.2和qtcreator4.12.0

    编译qt5 14 2 本来编译安装的是qt5 15 2 xff0c 编译安装ok xff0c 一切就绪 xff0c 安装qtcreator安装后一直报错 xff0c 以下插件有错误 xff0c 无法载入 xff1a QmlDesigner
  • PX4飞控的PPM接收机

    xff08 一 xff09 原理图 xff1a PX4飞控的PPM输入捕获由协处理器完成 xff0c 接在A8引脚 xff0c 对应Timer1的通道1 xff08 二 xff09 PPM协议 xff1a PPM的每一帧数据间隔为20ms
  • WPF DocumentViewer控件如何隐藏搜索栏/工具栏/部分按钮

    WPF DocumentViewer中默认是显示工具栏和搜索栏的 xff0c 如果想隐藏工具栏和搜索栏 xff0c 可以通过以下代码实现 lt DocumentViewer gt lt DocumentViewer Resources gt
  • 什么是stl? 如何使用stl?

    1 什么是STL xff1f STL Standard Template Library 是C 43 43 的标准模板类库 STL是一个功能强大的基于模板的容器库 xff0c 通过直接使用这些现成的标准化组件可以大大提高算法设计的效率和可靠
  • STM32F4+LAN8720A+STM32CubeMX+Lwip 网络通讯(以太网通讯)小实例

    一 目标实现 通过网络通信的方式 xff0c 当上位机发出对应指令给STM32 xff0c STM32根据收到的指令来执行对应的操作 xff08 例如 xff1a 亮灯 灭灯 闪灯等 xff09 还有可以将STM32连上路由器 xff0c
  • STM32: ADC采样频率及相应时间的确定

    转载自 xff1a http m elecfans com article 594153 html 一 STM32 ADC 介绍 STM32 ADC 是一个12 位精度 一种逐次逼近型模拟数字转换器 它有多达18个通道 xff0c 可测量1
  • Windows中使用GCC编译STM32CubeMx生成的Makefile文件

    1 下载ARM官方对应Cortex M内核的GCC编译器 xff1a https developer arm com tools and software open source software developer tools gnu t
  • STM32-USB学习系列(四):USB-HID模拟鼠标功能

    一 整体步骤 使用STM32CubeMX 生成 HID 模版自己定义mouseHID 结构体 xff0c 然后通过发送鼠标报文控制鼠标的移动 二 STM32CubeMX 配置 芯片 xff1a STM32F407VG 使用USB的时候 xf
  • STM32实用应用系列:串口接收不定长数据(HAL库 UART + DMA)

    目录 一 串口接收不定长数据的实现思路 二 具体实现代码 1 USART 的配置 2 DMA的配置 xff08 放在 HAL UART MspInit 中 xff09 3 USART 中断处理函数 一 串口接收不定长数据的实现思路 在串口通
  • 使用Ventoy制作启动盘

    目录 一 Ventoy介绍 二 Ventoy的使用 三 Ventoy中MBR分区形式与GPT分区形式对比 四 使用自定义的EFI的步骤 Ventoy下载地址 xff1a https www ventoy net cn index html
  • DRAM知识整理系列(三):部分时序参数整理

    目录 一 时序参数整理 第一时序 xff1a 1 tCL CAS Lantency Control 2 tRCD RAS to CAS Delay 3 tRP Row Precharge Timing 4 tRAS RAS Active T
  • ROS移动机器人开发——硬件引脚

    我们使用的32开发板为冰达机器人官方的开发板 xff0c 类型为STM32RCT6 32章节的目的为 xff0c 将官方所给源码转化为 官方标准库函数来进行使用 需求提出 xff1a 电源 1 3 3V 200ma供电 2 输入 9 12
  • UDS知识整理(一):UDS简介与UDS要求规范简介

    本文参考自 xff1a ISO DIS 14229 1 一 汽车诊断与OSI模型对比 注 xff1a OSI全称 xff1a Open System Interconnection Reference Model xff0c 即开放式系统互
  • Renesas:配置中断的常规流程——使用C语言方式配置中断向量表(二)

    Renesas xff1a 配置中断的常规流程 不吃鱼的猫丿的博客 CSDN博客 在前面的文章讲到了Renesas的常规中断配置流程 xff0c 当需要添加新的中断时 xff0c 每次都需要到boot asm中添加中断服务的函数名与中断服务
  • 工作经验总结:MCU寄存器库的开发

    目录 一 寄存器的结构体定义 二 寄存器的地址的宏定义 在进行MCU开发的时候 xff0c 可能会遇到需要自己手写寄存器库的情况 xff0c 以下整理了一些相关的示例以及注意事项 一 寄存器的结构体定义 注意 xff1a 在定义寄存器结构体
  • 汽车标定知识整理(三):CCP报文可选命令介绍

    目录 一 可选命令 CRO命令报文的可选命令表 xff1a 二 可选命令帧格式介绍 1 GET SEED 获取被请求资源的种子 xff08 0x12 xff09 2 UNLOCK 解锁保护 xff08 0x13 xff09 3 SET S
  • LIN资料整理(一):LIN入门简介

    目录 一 LIN是什么 1 LIN简介 2 LIN的适用场景 3 LIN协议版本 4 LIN的主从机节点 主从机任务与LIN总线特点 一 LIN是什么 1 LIN简介 LIN 是Local Interconnect Network 的缩写
  • LIN资料整理(二): LIN协议层

    目录 一 LIN帧的结构 1 帧头的帧结构 xff08 1 xff09 同步间隔段 xff08 2 xff09 同步段 xff08 3 xff09 受保护ID段 2 应答的帧结构 xff08 1 xff09 数据段 xff08 2 xff0
  • Altium designer学习(一)AD画板流程总结

    AD画板 xff0c 初学者总是容易犯上一个手忙脚乱的错误 一会儿去找封装 xff0c 一会儿又去忙原理图 这样都是很影响效率的事情 xff0c 要解决这个问题 xff0c 那就是画板得确定下来一个合理的流程 因此 xff0c 在第一篇就强
  • 网络编程(UDP/TCP)

    1 网络模型 数据从网络中一个终端上的应用程序传送到另外一个终端的应用程序 xff0c 中间需要经历很多过程 xff0c 有多方参与对数据进行层层封装 转发 我们把这个流程在逻辑上进行分层 xff0c 每一层根据本层的规章制度 协议 各司其