TCP和UDP编程

套接字编程
套接字: 进行网络通信的一种手段 socket
流式套接字(SOCK_STREAM) :传输层基于tcp协议进行通信
数据报套接字(SOCK_DGRAM) :传输层基于udp协议进行通信
原始套接字(SOCK_RAW): 访问底层协议的套接字
TCP 服务端
from socket  import *
1. 创建套接字
socket(socket_family=AF_INET,
             socket_type=SOCK_STREAM,
             proto = 0)
功能 : 创建套接字
参数 : socket_family:选择地址族种类 AF_INET (UNIX)
       socket_type : 套接字类型SOCK_STREAM 流式
                                      SOCK_DGRAM 数据报
                proto :子协议类型默认为0
返回值 : 返回创建的套接字
2. 绑定 IP 和端口号
sockfd.bind()
功能 : 绑定IP和端口
参数 : 是一个元组 ,第一项是字符串形式的IP
                     第二项是端口号
                (‘192.168.1.2’,8888)

3. 让套接字具有监听功能
sockfd.listen(n)
功能 : 使套接字变为监听套接字,同时创建监听队列
参数 : n 监听队列大小

4. 等待客户端连接
sockfd.accept()
功能 : 阻塞等待客户端连接
返回值 : 第一个:返回一个新的套接字用来和客户端通信
                    第二个:返回连接的客户端的地址

5. 消息的收发
recv(buffer)
功能 : 接收消息
参数 : 一次接收消息的大小  字节
返回值: 接收到的内容

send(data)
功能: 发送消息
参数: 发送的内容  (byte)
返回值 : 发送了多少个字节

* 当没有接收端的时候send操作会导致 broken pipe

6. 关闭套接字
close()
功能 : 关闭套接字

tcp客户端流程

1.创建流式套接字
2.发起连接请求
connect()
功能:发起连接
参数 : 一个元组  第一个元素 : 服务器的IP
                  第二个元素 : 服务器的port

3.收发消息
4.关闭套接字


udp通信
1.创建数据报套接字
sockfd = socket(AF_INET,SOCK_DGRAM)
2. 绑定服务端地址
ADDR = ('192.168.1.2',8888)
sockfd.bind(ADDR)
3.收发消息
data,addr = recvfrom(buffersize)
功能 : 接收数据报套接字消息
参数 : 每次最多接收消息的大小  字节
返回值 : data : 接收到的消息
          addr : 消息发送者的地址

*revefrom 一次接收一个数据包,如果数据包一次没有接受完则会丢失没接受的内容

sendto(data,addr)
功能:发送消息
参数: data 要发送的消息
       addr  发送给某个主机的地址
返回值 : 发送消息的字节数

4.关闭套接字
close()

tcp 和 udp的区别
1. tcp传输数据使用字节流的方式传输,udp是数据包
2. tcp会产生粘包现象,udp不会
3. tcp对网络条件要求高,udp更适合实时传输
4. tcp编程可以保证传输的可靠性,udp则不保证
5. tcp使用listen accept,udp不需要
6. 收发消息tcp使用recv  send   sendall
           udp使用recvfrom sendto

套接字属性

s = socket()

s.fileno()
功能: 获取套接字的描述符
*描述符 : 每一个IO操作系统都会分配一个不同的整数与之对应,该正数即为此IO操作的描述符

s.type : 获得套接字类型

s.getsockname()
功能: 获取套接字绑定的地址

s.getpeername()
功能 : 使用accept生成的套接字调用,获取该套接字对应的客户端的地址

s.setsockopt(level,optname,value)
功能 : 设置套接字选项
参数 : level :要定义的选项类型
                可选值 ---》IPPROTO_TCP  IPPROTP_IP
                            SOL_SOCKET

                optname:根据level确定的自选项

                value : 根绝选项设置的值

tcp应用之 http传输

HTTP协议 (超文本传输协议)

网站访问流程
1.客户端(浏览器)发起http请求
2.传输层使用tcp协议建立连接,层层打包将请求内容发送给服务器
3.web服务器解包后解析http请求,交后端应用程序处理
4.后端应用得到结果,通过web服务器回发个前端

用途 : 网站中网页的传输和数据传输
        也可用作基于http协议的编程传输数据

特点 : 应用层协议,传输层使用tcp连接
        简单,灵活,接口使用方便
                几乎支持所有的数据类型
                是无状态的
                http1.1  持续连接

请求(request)
格式 :

请求行     确定具体的请求类型
请求头     对请求内容的信息描述
空行
请求正文   具体请求参数

请求行 : GET       /index.html   HTTP/1.1
          请求方法  请求资源      协议版本

请求方法:GET     获取网络资源
          POST    提交一定的附加数据,得到返回结果
                    HEAD    获取响应的头信息
                    PUT     获取服务器资源
                    DELETE  删除服务器资源
                    TRACE   用于测试
                    CONNECT  保留方法
                    OPTIONS  请求获取服务器性能和信息

请求头:

选项 : 值

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
Connection: keep-alive
Cookie: BAIDUID=8A4DA4339C1B8A74DD251F7D9F834C76:FG=1; BIDUPSID=8A4DA4339C1B8A74DD251F7D9F834C76; PSTM=1508468466; LOCALGX=%u5317%u4EAC%7C%30%7C%u5317%u4EAC%7C%30; Hm_lvt_e9e114d958ea263de46e080563e254c4=1525941959,1525943966; FP_UID=f384d9df1f5cac6baf3efa25f3a454af; H_PS_PSSID=1468_21089_20928
Host: news.baidu.com
Referer: https://www.baidu.com/
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36

请求体:
get请求----》get参数  &a=1&b=2
post请求----》 post提交的内容


响应(response)

格式:
响应行     反馈响应的情况
响应头     对响应的具体描述
空行
响应体     具体返回给用户的内容

响应行 :  HTTP/1.1   200     OK
           协议版本   响应码  信息

1xx   提示信息,表示请求已经接收,正在处理
2xx   请求响应成功
3xx   重定向,完成任务需要其他操作
4xx   客户端错误
5xx   服务端错误

200  成功
401  没有访问权限
404  资源不存在
500  服务器发生未知错误
503  服务器暂时无法执行

响应头 格式同请求头
响应体 : 文件,图片

猜你喜欢

转载自blog.csdn.net/qq_15551663/article/details/81514673