您当前的位置:首页 > 计算机 > 编程开发 > Python

python精选21集 网络编程(TCP、UDP套接字编程、区别)

时间:04-26来源:作者:点击数:

一.socket套接字编程(TCP)

1.套接字

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

TCP通信需要经过创建连接、数据传送、终止连接三个步骤。

TCP通信模型中,在通信开始之前,一定要先建立相关的链接,才能发送数据,类似于生活中,“打电话”"

  • 套接字 : 实现网络编程进行数据传输的一种技术手段
  • Python实现套接字编程:import socket
  • 套接字分类
    • 流式套接字(SOCK_STREAM): 以字节流方式传输数据,实现tcp网络传输方案。(面向连接–tcp协议–可靠的–流式套接字)
    • 数据报套接字(SOCK_DGRAM):以数据报形式传输数据,实现udp网络传输方案。(无连接–udp协议–不可靠–数据报套接字)

2.tcp套接字

2.1tcp客户端与服务端总流程图
在这里插入图片描述
2.2服务端流程图
在这里插入图片描述
<1> 创建套接字

sockfd=socket.socket(socket_family=AF_INET,socket_type=SOCK_STREAM,proto=0)

  • 功能:创建套接字
  • 参数: socket_family 网络地址类型 AF_INET表示ipv4
        socket_type 套接字类型 SOCK_STREAM(流式) SOCK_DGRAM(数据报)
        proto 通常为0 选择子协议
  • 返回值: 套接字对象
<2>绑定地址

本地地址 : ‘localhost’ , ‘127.0.0.1’

网络地址 : ‘172.40.91.185’

自动获取地址: ‘0.0.0.0’

sockfd.bind(addr)

功能: 绑定本机网络地址
参数: 二元元组 (ip,port) ('0.0.0.0',8888)
在这里插入图片描述
<3>设置监听

sockfd.listen(n)

  • 功能 : 将套接字设置为监听套接字,确定监听队列大小
  • 参数 : 监听队列大小
<4>等待处理客户端连接请求

connfd,addr = sockfd.accept()

  • 功能: 阻塞等待处理客户端请求
  • 返回值: connfd 客户端连接套接字
        addr 连接的客户端地址
<5>消息收发

data = connfd.recv(buffersize)

 功能 : 接受客户端消息
 参数 :每次最多接收消息的大小
 返回值: 接收到的内容

n = connfd.send(data)

 功能 : 发送消息
 参数 :要发送的内容 bytes格式
 返回值: 发送的字节数
<6>关闭套接字

sockfd.close()

- 功能:关闭套接字
2.3客户端流程图
在这里插入图片描述
<1>创建套接字
  • 注意:只有相同类型的套接字才能进行通信
<2>请求连接

sockfd.connect(server_addr)

  • 功能:连接服务器
  • 参数:元组 服务器地址
<3>收发消息
  • 注意: 防止两端都阻塞,recv send要配合
<4>关闭套接字
Demo【TCP客户端与服务端】
在这里插入图片描述
  • 编写代码后在当前路径下启动【以上代码可放入对应的py文件中,根据文件名启动】:
  • 客户端终端命令:python3 tcp_client.py
    在这里插入图片描述
  • 服务端终端命令:python3 tcp_server.py
    在这里插入图片描述
2.4 tcp 套接字数据传输特点
 tcp连接中当一端退出,另一端如果阻塞在recv,此时recv会立即返回一个空字串。
 tcp连接中如果一端已经不存在,仍然试图通过send发送则会产生BrokenPipeError
 一个监听套接字可以同时连接多个客户端,也能够重复被连接
2.5 网络收发缓冲区
 网络缓冲区有效的协调了消息的收发速度
 send和recv实际是向缓冲区发送接收消息,当缓冲区不为空recv就不会阻塞。
2.6 tcp粘包

代码示例:

day2/stick_send.py,stick_recv.py

  • 原因:tcp以字节流方式传输,没有消息边界。多次发送的消息被一次接收,此时就会形成粘包。
  • 影响:如果每次发送内容是一个独立的含义,需要接收端独立解析此时粘包会有影响。
  • 处理方法:
    • 人为的添加消息边界
    • 控制发送速度
Demo【沾包】
  • tcp_server.py
from socket import *

# 创建TCP套接字
tcp_socket = socket(AF_INET,SOCK_STREAM) # 不写参数默认也是tcp

# 绑定地址
server_addr = ("0.0.0.0",8888)
tcp_socket.bind(server_addr)

# 设置套接字为监听套接字 (设置后表示tcp_socket可以被客户端链接)
tcp_socket.listen(5)

# 处理客户端链接
while True:
    print("等待客户端链接....")
    connfd,addr = tcp_socket.accept()
    print("客户端",addr,'链接')

    # 收发消息
    while True:
        data = connfd.recv(1024)
        if not data:
            break
        print("接收到:",data.decode())
    connfd.close() # 对应客户端已经退出

# 关闭
tcp_socket.close()
  • tcp_client.py
from socket import *
from time import sleep

# 服务器地址
server_addr = ('192.168.124.133',8888)

# 创建套接字
tcp_socket = socket()  # 默认值就是tcp

# 发起链接
tcp_socket.connect(server_addr)

# 循环发送消息
for i in range(5):
    # tcp_socket.send(b"12#")  # 加分割符号

    sleep(0.1) # 认为添加发送延迟
    tcp_socket.send(b"12")

# 断开链接
tcp_socket.close()
练习
  • 将一个文件从客户端发送到服务端,要求文件类型随意.
  • 思路:读取文件–> send发送 recv接收–> write写入
1 from socket import *
 2 import time
 3 #    读取文件--> send发送
 4 s = socket()
 5 s.connect(('127.0.0.1',8888))
 6 
 7 f = open('img.jpg','rb')
 8 
 9 # 读取内容,将其发送
10 while True:
11   data = f.read(1024)
12   if not data:
13     time.sleep(0.1)
14     s.send(b'##')
15     break
16   s.send(data)
17 
18 time.sleep(0.1)
19 s.send("发送完毕".encode())
20 
21 f.close()
22 s.close()
23 ---------------------------------------------
24 from socket import *
25 
26 s = socket()
27 s.bind(('0.0.0.0',8888))
28 s.listen(3)
29 
30 c,addr = s.accept()
31 print("Connect from",addr)
32 
33 # 以二进制写入
34 f = open('mm.jpg','wb')
35 
36 #循环接收内容,写入文件
37 while True:
38 #    recv接收--> write写入
39   data = c.recv(1024)
40   if data == b'##':
41     break
42   f.write(data)
43 
44 data = c.recv(1024)
45 print(data.decode())
46 
47 f.close()
48 c.close()
49 s.close()

二.socket套接字(UDP)

1.套接字

socket(简称 套接字) 是进程间通信的一种方式,它与其他进程间通信的一个主要不同是:

它能实现不同主机间的进程间通信,我们网络上各种各样的服务大多都是基于 Socket 来完成通信的

例如我们每天浏览网页、QQ 聊天、收发 email 等等

  • 套接字 : 实现网络编程进行数据传输的一种技术手段
  • Python实现套接字编程:import socket
  • 套接字分类
    • 流式套接字(SOCK_STREAM): 以字节流方式传输数据,实现tcp网络传输方案。(面向连接–tcp协议–可靠的–流式套接字)
    • 数据报套接字(SOCK_DGRAM):以数据报形式传输数据,实现udp网络传输方案。(无连接–udp协议–不可靠–数据报套接字)

2.UDP套接字

2.1udp客户端与服务端总流程图
在这里插入图片描述
2.2服务端流程图
在这里插入图片描述
<1> 创建数据报套接字

sockfd = socket(AF_INET,SOCK_DGRAM)

<2> 绑定地址

sockfd.bind(addr)

<3> 消息收发

data,addr = sockfd.recvfrom(buffersize)

功能: 接收UDP消息
参数: 每次最多接收多少字节
返回值: data 接收到的内容
    addr 消息发送方地址

n = sockfd.sendto(data,addr)

功能: 发送UDP消息
参数: data 发送的内容 bytes格式
    addr 目标地址
返回值:发送的字节数
<4>关闭套接字

sockfd.close()

2.3客户端流程图
在这里插入图片描述
<1>创建套接字
<2>收发消息
<3>关闭套接字
Demo【UDP】
在这里插入图片描述
  • 编写代码后在当前路径下启动【以上代码可放入对应的py文件中,根据文件名启动】:
  • 客户端终端命令:python3 udp_client.py
    在这里插入图片描述
  • 服务端终端命令:python3 udp_server.py
    在这里插入图片描述

三.TCP与UDP区别

  • 传输特征
  • TCP提供可靠的数据传输,但是UDP则不保证传输的可靠性
  • TCP传输数据处理为字节流,而UDP处理为数据包形式
  • TCP传输需要建立连接才能进行数据传,效率相对较低,UDP比较自由,无需连接,效率较高
  • 套接字编程区别
    • 创建的套接字类型不同
    • tcp套接字会有粘包,udp套接字有消息边界不会粘包
    • tcp套接字依赖listen accept建立连接才能收发消息,udp套接字则不需要
    • tcp套接字使用send,recv收发消息,udp套接字使用sendto,recvfrom
  • 使用场景
    • tcp更适合对准确性要求高,传输数据较大的场景
      • 文件传输:如下载电影,访问网页,上传照片
      • 邮件收发
      • 点对点数据传输:如点对点聊天,登录请求,远程访问,发红包
    • udp更适合对可靠性要求没有那么高,传输方式比较自由的场景
      • 视频流的传输: 如直播,视频聊天
      • 广播:如网络广播,群发消息
      • 实时传输:如游戏画面
    • 在一个大型的项目中,可能既涉及到TCP网络又有UDP网络
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门