网络tcp协议的概述:
TCP协议, 传输控制协议(全称:Transmission Control Protocol)是一种面向连接的, 可靠的, 基于字节流的传输层通信协议, TCP通信需要经过创建连接, 数据传送, 终止连接 三个步骤, 类似于生活中的打电话场景, 需要建立连接, 确认发送结果, 安全传输.
TCP 严格区分客户端和服务端, 服务端一般都需要绑定端口, 否则客户端找不到服务器, 客户端一般不绑定端口, 如果客户端绑定端口会出现端口冲突导致无法多开的问题
TCP 相比 UDP 有哪些优势?
面向连接( 确认有创建三方交握, 连接已创建才做传输 ) , 有序数据传输, 重发丢失数据包, 舍弃重复数据包, 差错的数据传输, 阻塞和流量控制
网络 TCP 通信实现步骤:
- TCP 客户端:
# 创建套接字
tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接服务器
tcp_client_socket.connect(('server_ip', server_port))
# 向服务器发送数据
tcp_client_socket.send('数据'.encode('utf-8'))
# 接收服务器回传的数据
recv_data = tcp_client_socket.recv(1024)
# 关闭套接字
tcp_client_socket.close()
- TCP 服务端:
# 创建套接字
tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定端口信息
tcp_server_socket.bind(("", 8080))
# 把监听器主动改为被动
tcp_server_socket.listen(128)
# 用accept等待客户端连接( 在客户端连接之前处于堵塞状态, 一直到客户端连接才会解堵塞 )
# 同时返回一个新的套接字专为客户端服务, 以及客户端的ip , port
client_socket, client_addr = tcp_server_socket.accept()
# 等待客户端发送数据
recv_data = client_socket.recv(1024).decode('utf-8')
# 可 向客户端回传数据
client_socket.send("收到".encode('utf-8'))
# 关闭该客户端的套接字
client_socket.close()
# 关闭服务器套接字
tcp_server_socket.close()
补充说明:
listen(128) 数值代表的含义
监听变主动变被动, 128 指定最多允许多少个客户端连接到服务器, 他的值至少为1, 收到连接请求后, 这些请求需要排队, 如果队列满, 就拒绝请求, 请注意: 最大限制是取决于操作系统, Ubuntu上默认是128
TCP 服务器 recv 解堵塞的两种方式
1、收到客户端发送的数据, 会自动解堵塞
2、客户端关闭了套接字
Re:可以通过判断收到数据的长度来判断客户端是否下线, 长度为0代表已下线