2高级编程-socket套接字-UDP与TCP通信-全栈式开发22

TCP与UDP通信

  • 一、UDP与TCP协议
      • (一)UDP协议
      • (二)TCP协议
      • (三)TCP与UDP区别
  • 二、socket套接字
      • (一)socket套接字介绍
      • (二)socket下的网络关系
      • (三)创建与关闭套接字
        • `socket.socket()`
        • `close()`
  • 三、UDP发送与接收信息
      • (一)方法介绍
        • `socket.socket() 创建套接字`
        • `sendto() 发送数据`
        • `bind() 与 recvfrom 接收数据`
        • `close 关闭套接字`
      • (二)UDP实现信息传输
  • 四、TCP发送与接收信息
      • (一)方法介绍
        • `socket.socket() 创建套接字`
        • `socket.connect() 客户端请求链接`
        • `send() 发送数据`
        • `tcp_server.bind() 、listen()、accept() 服务端等待链接`
        • `recv()接收数据`
        • `close 客户端关闭套接字`
      • (二)TCP实现信息传输
  • 五、文件复制案例

一、UDP与TCP协议

(一)UDP协议

定义

  • 当应用程序希望通过UDP与一个应用程序通信时,传输数据之前源端和终端不建立链接
  • 当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上
  • 并没有与客户端、服务端建立链接
  • 直接扔数据
    在这里插入图片描述

UDP通信
2高级编程-socket套接字-UDP与TCP通信-全栈式开发22_第1张图片

(二)TCP协议

定义

  • 当应用程序希望通过TCP与另一个人应用程序通信时,它会发送一个通信请求。这个请求必须被送到一个确切的地址。在双方‘握手’之后,TCP将在两个应用之间建立一个双工(full-duplex)的通信
  • 这个全双工的通信将占用两个计算机之间的通信路线,直到它被一方或双方关闭为止
  • 双方一定要都接收请求后才可以通讯
    2高级编程-socket套接字-UDP与TCP通信-全栈式开发22_第2张图片
    2高级编程-socket套接字-UDP与TCP通信-全栈式开发22_第3张图片
    2高级编程-socket套接字-UDP与TCP通信-全栈式开发22_第4张图片

TCP通信

  • 发送的消息一定要回复,这样才能保证数据是安全的
  • 确保会回复消息
    2高级编程-socket套接字-UDP与TCP通信-全栈式开发22_第5张图片

TCP特点

  • 面向连接
  • 可靠传输
    • TCP采用发送应答机制:只用对方回复应答了这个才叫发送成功
    • 超时重传:发送端发送报文段后,启动了计时器,如果在时间内没有应答回复,就会重新发送报文段
    • 错误校检:TCP是通过错误校验来看发送和接收的时候是否出现错误
    • 流量控制和阻塞管理:避免主机发送过快,接收方来不及接收

(三)TCP与UDP区别

  • TCP面向链接 ;UDP是无链接的,即发送数据之前不需要建立链接
  • TCP提供可靠的服务,也就是说,通过TCP链接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付
  • UDP具有较好的实时性,工作效率比TCP高,适用于告诉创术和实时性较高的通信或广播通信
  • 每一条TCP链接只能是点到点;UDP支付一对一,一对多和多对一和多对多的交互通信
  • TCP对系统资源要求较多,UDP对系统资源要求较少

二、socket套接字

利用socket套接字实现通信

(一)socket套接字介绍

  • socket又称套接字,应用程序通过套接字想网络发出请求或者应答玩过请求,是主机间或者一台计算机上的进程间可以通讯,白话说,socket就是两个节点为了互相通信,而在各自家里装的一部电话

(二)socket下的网络关系

  • 加入socket后的网络关系
    2高级编程-socket套接字-UDP与TCP通信-全栈式开发22_第6张图片

(三)创建与关闭套接字

socket.socket()

创建套接字

  • socket.socket ( family = socket.AF_INET, type = socket.SOCK_DGRAM )

  • family:地址族 协议族

    • 选择 AF_INET 的目的就是使用 IPv4 进行通信
    • AF_INET(又称 PF_INET)是 IPv4 网络协议的套接字类型
  • type :套接字的类型

    • SOCK_DGRAME —> UDP套接字
    • SOCK_STREAM —> TCP 套接字
close()

关闭套接字

  • 创建对象.close()
    2高级编程-socket套接字-UDP与TCP通信-全栈式开发22_第7张图片

三、UDP发送与接收信息

用到套接字

(一)方法介绍

socket.socket() 创建套接字
  • udp_s=socket.socket(family=socket.AF_INET,type=socket.SOCK_DGRAM)
  • udp_s就是一个套接字,用来传递信息
sendto() 发送数据

发送数据

  • sendto(data: bytes, address: Union[tuple, str]) -> int: …
    • date:一定得是字节
    • address:格式是tuple, (“ip地址”, 端口号)
bind() 与 recvfrom 接收数据

bind()

  • 绑定本地端口
  • bind((“ip地址”,端口号))
    • ip地址:’’,‘localhost’,‘127.0.0.1’ 和 普通ip地址 均可以
    • 端口号:接收器的端口,发送器的目标端口
    • 元组的形式传进去

recvfrom

  • 接收数据
  • .recvfrom(接收最大字节数)
    • 一般就填1024
  • 接收的数据是元组格式:(二进制的数据, (‘ip地址’, 端口))
    • ip地址:是发送器的地址
    • 端口:是发送器的地址
close 关闭套接字
  • udp_s.close()
  • 关闭就没有办法接收和发送信息

(二)UDP实现信息传输

UDP发送数据

  • 实现步骤:
    1.创建套接字
    2.使用套接字收/发数据
    3.关闭套接字

只能接同时连接一个
2高级编程-socket套接字-UDP与TCP通信-全栈式开发22_第8张图片
2高级编程-socket套接字-UDP与TCP通信-全栈式开发22_第9张图片

udp接收数据

  • 实现步骤:
    1.创建套接字
    2.绑定本地信息(ip和端口)
    3.接受数据
    4.打印数据
    5.关闭套接字
    2高级编程-socket套接字-UDP与TCP通信-全栈式开发22_第10张图片

UDP发送、接收数据结合
2高级编程-socket套接字-UDP与TCP通信-全栈式开发22_第11张图片

四、TCP发送与接收信息

用到套接字

(一)方法介绍

socket.socket() 创建套接字
  • tcp_client=socket.socket(family=socket.AF_INET,type=socket.SOCK_STREAM)
    tcp_server
  • tcp_client来表示客户端,tcp_server来表示服务端,用来传递信息
socket.connect() 客户端请求链接

socket.connect()

  • 客户端请求与服务端建立链接
  • tcp_client.connect((server_ip, server_port))
  • 客户端需要与服务端建立链接, 服务端不需要,只需要绑定本地信息,等待别人链接
  • 填写的是服务端的信息,ip地址本地的话不能不填,‘localhost’和‘127.0.0.1’都可以
send() 发送数据
  • 向服务端传送数据,向客户端回复消息
  • send(data)
  • 必须是二进制,不需要另外绑定地址信息
tcp_server.bind() 、listen()、accept() 服务端等待链接

bind()

  • 绑定本地端口
  • bind((“ip地址”,端口号))
    • ip地址:必须写正确的本机ip地址, ‘’ 或 ‘127.0.0.1’ 或 'localhost '不可用
    • 端口号:服务端的端口,客户端的目标端口
    • 元组的形式传进去

listen()

  • 将未连接主动套接口的转换为被动套接口,即允许客户端链接
  • listen(backlog)
    • backlog 表示的是 服务器 拒绝连接之前 操作系统可以挂起的最大连接数据。
    • backlog = 1 不是指服务器最大接收1个客户端连接

accept()

  • 服务端等待客户端的链接
  • 会阻塞 ,等待客户端连接 如果客户端与服务端连接,则解阻塞
  • 返回值:(socket object, address info)
    • socket object :
      • 是用来和和客户端联系信息用的新套接字,接到请求产生socket object,服务端socket产生的套接字已经关闭了
      • 客户端关闭,服务端则会关闭所有未关闭的新套接字
      • 服务端socket产生的套接字是用来监听的,不能直接用于发送接收数据。
    • address info:
      (客户端的ip地址,客户端的端口号)
    • 返回的是元组,我们会用元组的拆包将信息拿出来
      new_client_socket, client_addr = tcp_server.accept()
recv()接收数据

客户端和服务端接收数据

  • tcp.recv(size)
  • 最大接收size,1024*n,一般填1024
  • 接收的是二进制数据,不需要拆包,不同于recvfrom
close 客户端关闭套接字
  • tcp_client.close()
  • 客户端关闭,服务端则会关闭所有未关闭的新套接字

(二)TCP实现信息传输

TCP客户端构建流程
1.创建socket
2.链接服务器
3.接收数据
4.关闭套接字
2高级编程-socket套接字-UDP与TCP通信-全栈式开发22_第12张图片
TCP服务端
1.socket创建套接字 买手机
2.bind绑定IP和port 插上手机卡
3.listen使套接字变为可以被动链接 允许别人打电话给你
4.accept等待客户端的链接 等待别人打电话
5.recv/send接收发送数据 聊聊天

2高级编程-socket套接字-UDP与TCP通信-全栈式开发22_第13张图片
TCP通信
2高级编程-socket套接字-UDP与TCP通信-全栈式开发22_第14张图片
2高级编程-socket套接字-UDP与TCP通信-全栈式开发22_第15张图片
2高级编程-socket套接字-UDP与TCP通信-全栈式开发22_第16张图片

  • 服务器链接的多个客户端,可以允许断开又链接的,重复链接的
  • 必须加两个循环,一个循环是允许多个客户端链接,一个是循环发送与接收信息

五、文件复制案例

2高级编程-socket套接字-UDP与TCP通信-全栈式开发22_第17张图片
2高级编程-socket套接字-UDP与TCP通信-全栈式开发22_第18张图片
文件夹复制案例—利用到进程,多个文件同时复制
–>点这里-第四章

你可能感兴趣的:(web全栈开发知识,socket,python)