高级编程技巧 学习笔记
一、TCP
1.1、TCP 介绍
-
TCP协议,传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层通信协议。
-
TCP通信需要经过创建连接、数据传送、终止连接三个步骤。
-
TCP通信模型中,在通信开始之前,一定要先建立相关连接,才能发生数据。
1.2、TCP 特点
-
面向连接
通信双方必须先建立连接才能进行数据的传输 -
可靠传输
(1)TCP采用发送应答机制
(2)超时重传
(3)错误校验
(4)流量控制和阻塞管理
二、TCP 客户端 与 服务端
服务端: 就是提供服务的一方。
客户端: 就是需要被服务的一方。
2.1、TCP客户端构建流程
-
创建 socket
-
链接服务器
-
接收数据(最大接收2014个字节)
-
关闭套接字
import socket
# from socket import *
def main():
# 创建 TCP 套接字(使用不同的导入方式, 则用不同的创建形式)
tcp_client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# tcp_client = socket(AF_INET, SOCK_STREAM)
# 链接服务器
server_ip = input("server ip:")
server_port = int(input("server port:")) # 注意端口是整数类型
tcp_client.connect_ex((server_ip, server_port))
# 发送数据
send_data = input("发送的数据:")
# 因为上面已经连接过, 所以用 send 而不用 sendto
tcp_client.send(send_data.encode())
# 接收数据, 没收到数据则阻塞
recvdata = tcp_client.recv(1024)
print(recvdata.decode('gbk'))
# 关闭连接
tcp_client.close()
if __name__ == '__main__':
main()
2.2、TCP 服务端
-
socket 创建套接字
-
bind 绑定 IP 和 port
-
listen 使套接字变为可以被动链接
-
accept 等待客户端的链接
-
recv/send 接收发送数据
import socket
def main():
# tcp 的套接字(监听套接字, 监听谁发送连接申请, 然后创建新套接字)
tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定信息
tcp_server.bind(("", 7890))
# 主动变被动
tcp_server.listen(128)
# accept() -> (socket object, address info) accept 返回的两个参数
# 接收监听后创建的一对一套接字
new_client_socket, client_addr = tcp_server.accept()
# print(client_addr)
# 接收数据
recv_data = new_client_socket.recv(1024)
print(recv_data)
# 发送数据
new_client_socket.send('haha'.encode('gbk'))
# 关闭连接
new_client_socket.close()
tcp_server.close()
if __name__ == '__main__':
main()
三、劣质版 TCP 服务端为多个客户端服务(不能同时服务)
import socket
def main():
# tcp的套接字
tcp_server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定信息
tcp_server.bind(("", 7890))
# 为多个客户端服务
while True:
# 主动变被动
tcp_server.listen(128)
new_client_socket, client_addr = tcp_server.accept()
# print(client_addr)
# 为客户端多次服务
while True:
# 接收数据 阻塞
recv_data = new_client_socket.recv(1024)
print(recv_data)
# 客户端发送过来数据
# 没有数据时, 客户端断开连接
if recv_data.decode('gbk'):
# 发送数据
new_client_socket.send('haha'.encode('gbk'))
else:
break
# 关闭客户端对应套接字
new_client_socket.close()
#关闭监听套接字
tcp_server.close()
if __name__ == '__main__':
main()
四、TCP 与 UDP 区别
-
TCP面向连接;UDP是无连接的,即发送数据之前不需要建立连接。
-
TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付。
-
UDP具有较好的实时性,工作效率比TCP高,适用于对高速传输和实时性有较高的通信或广播通信。
-
每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信。
-
TCP对系统资源要求较多,UDP对系统资源要求较少。
UDP 通信
TCP 通信