网络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代表已下线