一,基于tcp协议通信的套接字程序(加上通信循环和连接循环)
A 服务端
import socket #1、买手机 phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #流式协议指的就是tcp协议 # print(phone) # phone.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) #就是它,在bind前加 #2、插手机卡 phone.bind((\'127.0.0.1\',8081)) #端口范围0-65535 #3、开机 phone.listen(5) #限制的是请求数,而非链接数 #4、等待电话连接 print(\'服务的启动......\') while True: # 连接循环 conn,client_addr=phone.accept() #(tcp的连接对象,客户端的ip和端口) # print(conn) print(client_addr) # 通信循环 while True: try: #针对的是windows系统 #5、收消息 data=conn.recv(1024) #最大接收1024bytes if not data:break #针对的linux系统 print(\'客户端数据:%s\' %data) #6、发消息 conn.send(data.upper()) except ConnectionResetError: break #7、挂电话 conn.close() #9、关机 phone.close()
B 客户端(可以多个,但是每次服务端只能处理一个,只有一个客户端断了才处理第二个客户端请求)
import socket #1、买手机 phone=socket.socket(socket.AF_INET,socket.SOCK_STREAM) #流式协议指的就是tcp协议 #2、打电话,建电话连接 phone.connect((\'127.0.0.1\',8081)) #ip和端口都是服务端的 while True: msg=input(\'>>>: \').strip() #msg=\'\' if not msg:continue #3、发消息 phone.send(msg.encode(\'utf-8\')) print(\'has send====>\') #4、收消息 data=phone.recv(1024) print(\'has recv====>\') print(data.decode(\'utf-8\')) #5、挂电话 phone.close()
二,模拟ssh远程执行命令
A 服务端
from socket import * import subprocess phone=socket(AF_INET,SOCK_STREAM) phone.bind((\'127.0.0.1\',8081)) phone.listen(5) print(\'服务的启动......\') # 连接循环 while True: conn,client_addr=phone.accept() print(client_addr) # 通信循环 while True: try: cmd=conn.recv(1024) if not cmd:break obj=subprocess.Popen(cmd.decode(\'utf-8\'),shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE ) stdout=obj.stdout.read() stderr=obj.stderr.read() # conn.send(stdout+stderr) print(len(stdout)+len(stderr)) conn.send(stdout) conn.send(stderr) except ConnectionResetError: break conn.close() phone.close()
B 客户端
from socket import * phone=socket(AF_INET,SOCK_STREAM) phone.connect((\'127.0.0.1\',8081)) while True: cmd=input(\'>>>: \').strip() if not cmd:continue phone.send(cmd.encode(\'utf-8\')) res=phone.recv(1024) #1024 * 8 print(res.decode(\'gbk\')) phone.close()
请发表评论