一、通信循环
服务端和客户端可以进行连续的信息交流
from socket import * ser_socket = socket(AF_INET, SOCK_STREAM) ser_socket.bind(('127.0.0.1', 8886)) ser_socket.listen(5) conn, addr = ser_socket.accept() while True: try: # 抛出异常,若不抛出处理,一旦客户端强行退出,服务端就会报错 data = conn.recv(1024) print(data.decode('utf-8')) conn.send(data.upper()) except ConnectionResetError: break conn.close() ser_socket.close()
from socket import * cli_socket = socket(AF_INET, SOCK_STREAM) cli_socket.connect(('127.0.0.1', 8886)) #通信循环,可以多次输入 while True: msg = input('>>>>:').strip() if len(msg) == 0: # 如果输入为空,给服务端发送信息之后,服务端什么都没接受,一直处于阻塞状态 continue cli_socket.send(msg.encode('utf-8')) data = cli_socket.recv(1024) print(data.decode('utf-8')) cli_socket.close()
tcp是基于数据流的,于是收发的消息不能为空,这就需要在客户端和服务端都添加空消息的处理机制
二、链接循环
from socket import * ser_socket = socket(AF_INET, SOCK_STREAM) ser_socket.bind(('127.0.0.1', 8886)) ser_socket.listen(5) #链接循环,可以同时启动最多6个客户端,但是只有一个处于连接状态,其余最多5个在半连接池等待。只有当连接状态的客户端断开连接,下一个客户端才进入连接 while True: conn, addr = ser_socket.accept() # 通信循环 while True: try: data = conn.recv(1024) print(data.decode('utf-8')) conn.send(data.upper()) except ConnectionResetError: break conn.close() ser_socket.close(
from socket import * cli_socket = socket(AF_INET, SOCK_STREAM) cli_socket.connect(('127.0.0.1', 8886)) while True: msg = input('>>>>:').strip() if len(msg) == 0: continue cli_socket.send(msg.encode('utf-8')) data = cli_socket.recv(1024) print(data.decode('utf-8')) cli_socket.close()
三、粘包问题
1、模拟ssh远程执行命令