网络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)
- # 等待客户端连接( 在客户端连接之前处于堵塞状态, 一直到客户端连接才会解堵塞 )
- # 同时返回一个新的套接字专为客户端服务, 以及客户端的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 解堵塞的两种方式
- 收到客户端发送的数据, 会自动解堵塞
- 客户端关闭了套接字
Re: 可以通过判断收到数据的长度来判断客户端是否下线, 长度为0代表已下线