Python——网络编程及通信协议

网络编程及通信协议

⚠️什么是通信协议?

协议及规则,有了Internet协议,任何私有网络,只要支持这个协议,就可以接入互联网

1.通信协议

(1)TCP/IP协议

  • TCP协议,即传输控制协议,是建立在IP协议基础之上的。TCP协议负责两台计算机之间建立可靠的联系,保证数据包按顺序发送到

  • 常见协议

层级 协议示例 功能描述
应用层 HTTP, FTP, SMTP 定义应用程序如何传输数据
传输层 TCP, UDP 提供进程间的数据传输服务
网络层 IP, ICMP 提供主机之间的寻址与路由服务
网络接口层 Ethernet, PPP 定义物理传输方式,如以太网等等

(2)UDP协议

  • UDP协议又被称为用户数据包协议,它是面向无连接的协议,只要知道对方的IP地址和端口,就可以直接发送数据包,由于是面向无连接的,所以无法保证数据一定会到达接受方

(3)两者区别

TCP协议 UDP协议
连接方面 面向连接的 面向无连接
安全方面 传输信息可靠,不丢失,按顺序到达 无法保证不丢包
传输效率方面 相对较低 传输效率高
连接对象数量方面 只能是点对点,一对一 支持一对一,一对多,多对多的交互通信

2.网络编程

2.1 基础

(1)Socket

Socket 是“套接字”,是操作系统提供的一个编程接口,用于在不同主机/进程之间进行通信。

  • 本质上是一个文件描述符,既可读也可写。
  • 支持 TCP(SOCK_STREAM)和 UDP(SOCK_DGRAM)通信。
描述IP地址和端口号
  • 常用方法
方法名称 功能描述
bind((ip, port)) 绑定IP地址和端口
listen(N) 开始TCP监听,N表示操作系统挂起的最大连接数量,取值范围在1-5之间,一般设置为5
accept() 被动接收TCP客户端连接,阻塞式
connect((ip,port)) 主动初始化TCP服务器连接
recv(size) 接收TCP数据,返回值为字符串类型,size表示要接收的最大数据量
send(str) 发送TCP数据,返回值是要发送的字节数量
sendall(str) 完整发送TCP数据,将str中的数据发送到连接到套接字,返回之前尝试发送所有数据,成功则为None,失败抛出异常
recvfrom() 接收UDP数据,返回值为一个元组(data,address),data表示接收的数据,address表示发送数据的套接字地址
sendto(data,(ip,port)) 发送UDP数据,返回值是发送的字节数
close() 关闭套接字
(2)TCP编程

⚠️一定要先运行服务器端再运行客户端

  • 服务端(接收数据的过程)
    1. 使用socket类创建一个套接字对象
    2. 使用bind((ip,port))方法绑定IP地址和端口号
    3. 使用listen()方法开始TCP监听
    4. 使用accept()方法等待客户端的连接
    5. 使用recv()/send()方法接收/发送数据
    6. 使用close()关闭套接字
from socket import socket,AF_INET,SOCK_STREAM 
#从socket模块中导入socket类
#AF_INET 用于Internet之间的进程通信
#SOCK_STREAM  表示使用 TCP 编程

#(1)创建socket对象
server_socket=socket(AF_INET,SOCK_STREAM)

#(2)绑定IP地址和端口
ip='127.0.0.1'
port=8888 #不要和系统的一些端口一样,比如MYSQL端口是3306
server_socket.bind((ip,port)) #里面是元组类型

#(3)使用listen()进行监听
server_socket.listen(5)
print('服务器已经启动')

#(4)等待客户端的连接
client_socket,client_addr=server_socket.accept() #系列解包赋值

#(5)接收来自客户端的数据
data=client_socket.recv(1024) #1024个数据
print('客户端发过来的数据为:',data.decode('utf-8')) #要求客户端发过来的数据都是使用utf-8进行编码的

#(6)关闭socket
server_socket.close()
  • 客户端(发送数据的过程)
    1. 使用socket类创建一个套接字对象
    2. 使用connect((host,port))设置连接主机IP和主机设置的端口号
    3. 使用recv()/send()方法接收/发送数据
    4. 使用close()关闭套接字
import socket
#(1)创建socket对象
client_socket=socket.socket()

#(2)IP地址和主机端口(服务器),向服务器端发动连接请求
ip='127.0.0.1'
port=8888  #必须与服务器上的是一样的
client_socket.connect((ip,port))
print('---------与服务器连接建立成功-------------')


#(3)发送数据
client_socket.send('welcome to China'.encode('utf-8'))

#(4)关闭
client_socket.close()
print('发送完毕')
(3)UDP编程
特点:
  • 没有连接过程,收发方独立
  • 适合广播、多播、实时性要求高的应用
  • 应注意数据包大小限制(一般不超过 512 或 1024 字节)

⚠️先运行接收方,再运行发送方

  • 接收方
from socket import socket,AF_INET,SOCK_DGRAM
#(1)创建socket对象
recv_socket=socket(AF_INET,SOCK_DGRAM)

#(2)绑定IP地址和端口
recv_socket.bind(('127.0.0.1',8888))

#(3)接收来自发送方的数据
recv_data,addr=recv_socket.recvfrom(1024)
print('接收到的数据为:',recv_data.decode('utf-8'))

#(4)准备回复对方的数据
data=input('请输入要回复的数据')

#(5)回复
recv_socket.sendto(data.encode('utf-8'),addr)

#(6)关闭
recv_socket.close()
  • 发送方
from socket import socket,AF_INET,SOCK_DGRAM
#(1)创建socket对象
send_socket=socket(AF_INET,SOCK_DGRAM)

#(2)准备发送的数据
data=input('请输入要发送的数据')

#(3)指定接收方的IP地址和端口
ip_port=('127.0.0.1',8888)

#(4)发送数据
send_socket.sendto(data.encode('utf-8'),ip_port)

#接收来自接收方的回复数据
recv_data,addr=send_socket.recvfrom(1024)
print('接收到的数据是',recv_data.decode('utf-8'))

#(5)关闭socket对象
send_socket.close()
补充:广播通信示例(发送端)
s = socket(AF_INET, SOCK_DGRAM)
s.setsockopt(SOL_SOCKET, SO_BROADCAST, 1)  # 开启广播
s.sendto(b'Hello, network!', ('255.255.255.255', 9999))

2.2 异常处理

拓展:异常处理(服务端示例)
try:
    client_socket, addr = server_socket.accept()
    data = client_socket.recv(1024)
    print("收到数据:", data.decode('utf-8'))
    client_socket.send("收到!".encode('utf-8'))
except Exception as e:
    print("连接出错:", e)
finally:
    server_socket.close()

2.3 网络编程应用场景

场景 所用协议 特点说明
网站/网页访问 TCP+HTTP 三次握手,保证页面完整加载
网络直播/语音通信 UDP+RTP 低延迟,允许一定数据丢失
聊天软件(如QQ) TCP+UDP 登录/文件传输用 TCP,语音/视频用 UDP
FTP文件传输 TCP+FTP 高可靠性传输大文件
网络游戏 UDP 要求低延迟、轻微丢包可接受

2.4 补充概念

  • 三次握手:客户端 → 服务端(SYN) → 确认(SYN+ACK) → 客户端确认(ACK)
  • 四次挥手:断开 TCP 连接的标准过程
  • 端口号:用于标识主机上的具体服务(0-65535)
    • 常见端口如 HTTP:80,HTTPS:443,MySQL:3306

你可能感兴趣的:(网络,python,开发语言)