⚠️什么是通信协议?
协议及规则,有了Internet协议,任何私有网络,只要支持这个协议,就可以接入互联网
TCP协议,即传输控制协议,是建立在IP协议基础之上的。TCP协议负责两台计算机之间建立可靠的联系,保证数据包按顺序发送到
常见协议
层级 | 协议示例 | 功能描述 |
---|---|---|
应用层 | HTTP, FTP, SMTP | 定义应用程序如何传输数据 |
传输层 | TCP, UDP | 提供进程间的数据传输服务 |
网络层 | IP, ICMP | 提供主机之间的寻址与路由服务 |
网络接口层 | Ethernet, PPP | 定义物理传输方式,如以太网等等 |
TCP协议 | UDP协议 | |
---|---|---|
连接方面 | 面向连接的 | 面向无连接 |
安全方面 | 传输信息可靠,不丢失,按顺序到达 | 无法保证不丢包 |
传输效率方面 | 相对较低 | 传输效率高 |
连接对象数量方面 | 只能是点对点,一对一 | 支持一对一,一对多,多对多的交互通信 |
Socket 是“套接字”,是操作系统提供的一个编程接口,用于在不同主机/进程之间进行通信。
描述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() |
关闭套接字 |
⚠️一定要先运行服务器端再运行客户端
socket
类创建一个套接字对象bind((ip,port))
方法绑定IP
地址和端口号listen()
方法开始TCP
监听accept()
方法等待客户端的连接recv()/send()
方法接收/发送数据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()
socket
类创建一个套接字对象connect((host,port))
设置连接主机IP
和主机设置的端口号recv()/send()
方法接收/发送数据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('发送完毕')
⚠️先运行接收方,再运行发送方
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))
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()
场景 | 所用协议 | 特点说明 |
---|---|---|
网站/网页访问 | TCP+HTTP | 三次握手,保证页面完整加载 |
网络直播/语音通信 | UDP+RTP | 低延迟,允许一定数据丢失 |
聊天软件(如QQ) | TCP+UDP | 登录/文件传输用 TCP,语音/视频用 UDP |
FTP文件传输 | TCP+FTP | 高可靠性传输大文件 |
网络游戏 | UDP | 要求低延迟、轻微丢包可接受 |