一,基于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()