企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
[TOC] # 特点 **面向连接** 通信双方必须先建立连接才能数据的传输. 这种连接是一对一的,因此tcp不适用于广播的应用程序,基于广播的应用请使用udp **可靠传输** tcp采用发送应答机制 超时机制 错误校验 流量控制和阻塞管理 # tcp与udp不同点 * 面向连接(确认有创建三方交握,连接已创建才作传输) * 有序数据传输 * 重发丢失的数据包 * 舍弃重复的数据包 * 无差错的数据传输 * 阻塞/流量控制 # tcp客户端 创建Socket时,`AF_INET`指定使用IPv4协议,如果要用更先进的IPv6,就指定为`AF_INET6` 接收数据时,调用`recv(max)`方法,一次最多接收指定的字节数,因此,在一个while循环中反复接收,直到recv()返回空数据,表示接收完毕,退出循环 ~~~ from socket import * # 创建socket tcp_client_socket = socket(AF_INET, SOCK_STREAM) # 目的信息 server_ip = input('请输入服务器ip : ') server_port = int(input('请输入服务器port : ')) # 链接服务器 tcp_client_socket.connect((server_ip, server_port)) # 提示用户输入数据 send_data = input('请输入要发送的数据 : ') tcp_client_socket.send(send_data.encode('utf-8')) # 接收对方发送过来的数据,最大接收1024字节 recvData = tcp_client_socket.recv(1024) print('接收到的数据为 : ', recvData.decode('utf-8')) # 关闭套接字 tcp_client_socket.close() ~~~ # tcp服务器 流程如下: 1. socket创建一个套接字 2. bind绑定ip和port 3. listen使套接字变为可以被动链接 4. accept等待客户端的链接 5. recv/send接收发送数据 ~~~ import socket # 创建套接字 tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 绑定本地信息 tcp_server_socket.bind(('', 13909)) # 让默认的套接字由主动变为被动 tcp_server_socket.listen(128) # 循环的目的:调用多次accept,从而为多个客户端服务 while True: # 等客户端的链接 accept new_client_socket, client_addr = tcp_server_socket.accept() print('一个新客户端已经连接了 %s ' % str(client_addr)) while True: # 接收客户端发送过来的请求 recv_data = new_client_socket.recv(1024) if recv_data: # 回送一部分数据给客户端 new_client_socket.send('---ok---'.encode('utf-8')) else: break print('客户端发送过来的请求是: %s ' % recv_data.decode('utf-8')) # 关闭套接字 new_client_socket.close() print('已经服务完了') # 监听套接字关闭了,那么会导致不能再次等待新客户端的到来,即xxx.accept就会失败 tcp_server_socket.close() ~~~