一 socket (套接字)
- socket处于应用层与传输层之间,提供了一些简单的接口,避免与操作系统之间的对接,省去了相当繁琐复杂的操作.
- socket在python中属于一个模块,通过调用模块中已经实现的方法建立两个进程之间的连接和通信。
1.1 基于TCP协议的socket通信
服务器端:
import socket phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) phone.bind(('127.0.0.1',8848)) phone.listen() print('开机') while 1: conn,addr = phone.accept() while 1: try: from_client_data = conn.recv(1024).decode("utf-8") if from_client_data.upper() == "Q": print('客户端已正常断开连接') break else: print(f'来自客户端的消息:{from_client_data}') while 1: to_client_data = input('>>>') if not to_client_data: print('内容不能为空!') continue else: conn.send(to_client_data.encode('utf-8')) break except ConnectionResetError: print('客户端异常断开连接') break conn.close() phone.close()
客户端:
import socket phone = socket.socket(socket.AF_INET,socket.SOCK_STREAM) phone.connect(('127.0.0.1',8848)) while 1: try: data = input('>>>') if not data: print('内容不能为空!') continue phone.send(data.encode('utf-8')) if data.upper() == "Q": break else: from_server_data = phone.recv(1024).decode('utf-8') print(f'来自服务器的消息:{from_server_data}') except ConnectionResetError: print('服务器异常断开连接') break phone.close()
实例: 远程执行命令
调用subprocess模块
import subprocess obj = subprocess.Popen('dir1', shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, ) print(obj.stdout.read().decode('gbk')) # 正确命令 print(obj.stderr.read().decode('gbk')) # 错误命令
1.2 socket缓存区
为什么会存在缓存区:
- 暂时存储一些数据
- 在网络波动时,保证数据的收发稳定,匀速
- 缺点: 造成了粘包现象之一