模拟SSH--client:
# Author:Tim Gu
import socket
client = socket.socket()
client.connect(('localhost',6969))
while True:
cmd = input(">>").strip()
if len(cmd) == 0:continue
client.send(cmd.encode("utf-8"))
cmd_res_size = client.recv(1024)
client.send(b"start_trans")
sev_file_size = int(cmd_res_size.decode())
#print('sev_file_size',sev_file_size,type(sev_file_size))
received_size = 0
received_data = b''
while received_size < sev_file_size:
data = client.recv(1024)
#print("收到数据!")
received_size += len(data)
received_data += data
#print('cli_file_size',received_data)
else:
#print("receive done...",received_size)
print(received_data.decode())
client.close()
模拟SSH--server:
# Author:Tim Gu
import socket,os,time
server = socket.socket()
server.bind(('localhost',6969))
server.listen()
while True:
print("beging waiting request...")
conn,addr = server.accept()
print("new conn:",addr)
while True:
print("request comming!",addr)
data = conn.recv(1024)
if not data:
print("客户端已断开")
break
print("执行指令:",data)
cmd = data.decode()
cmd_res = os.popen(cmd).read()
print("before send",len(cmd_res.encode('utf-8')))
if len(cmd_res) == 0:
com_res = "cmd has no output..."
conn.send(str(len(cmd_res.encode('utf-8'))).encode('utf-8'))
#time.sleep(0.5)
client_ack = conn.recv(1024) #wait client confirm
conn.send(cmd_res.encode("utf-8"))
print("send done")
server.close()
socketserver简易server:
# Author:Tim Gu
import socket
import socketserver
class MyTCPHandler(socketserver.BaseRequestHandler):
def handle(self):
while True:
try:
print("开始监听!")
self.data = self.request.recv(1024).strip()
print("{} wrote:".format(self.client_address[0]))
print(self.data)
if not self.data:
print(self.client_address,"断开了!")
break
self.request.send(self.data.upper())
except (WindowsError,ConnectionRefusedError) as e:
print(e)
break
if __name__ == "__main__":
HOST,PORT="localhost",9999
server = socketserver.ThreadingTCPServer((HOST,PORT),MyTCPHandler)
server.serve_forever()
socketserver简易client:
# Author:Tim Gu
import socket
def myquit():
choose = input("是否退出?'y' or 'n':").strip()
if choose == 'y':
exit("退出!")
else:
pass
client = socket.socket()
client.connect(('localhost',9999))
while True:
msg = input(">>").strip()
if len(msg) == 0:continue
client.send(msg.encode('utf-8'))
data = client.recv(10240)
print("recv:",data.decode())
myquit()
client.close()
传文件server:
# Author:Tim Gu
import socket,os,time,hashlib
server = socket.socket()
server.bind(('localhost',6969))
server.listen()
while True:
print("beging waiting request...")
conn,addr = server.accept()
print("new conn:",addr)
while True:
print("request comming!",addr)
data = conn.recv(1024)
if not data:
print("客户端已断开")
break
cmd,filename = data.decode().split()
if os.path.isfile(filename):
f = open(filename,'rb')
m = hashlib.md5()
file_size = os.stat(filename).st_size
conn.send(str(file_size).encode('utf-8')) #send file size
conn.recv(1024) #wait for ack
for line in f:
m.update(line)
conn.send(line)
print("file md5",m.hexdigest())
f.close()
conn.send(m.hexdigest().encode())
print("send done")
server.close()
传文件client:
# Author:Tim Gu
import socket,hashlib
client = socket.socket()
client.connect(('localhost',6969))
while True:
cmd = input(">>").strip()
if len(cmd) == 0:continue
if cmd.startswith('get'):
client.send(cmd.encode('utf-8'))
server_response = client.recv(1024)
print('server response:',server_response)
client.send(b'start to trans')
file_total_size = int(server_response.decode())
received_size = 0
file_name = cmd.split()[1]
f = open(file_name+".new",'wb')
m = hashlib.md5()
while received_size < file_total_size:
if file_total_size - received_size >= 1024:
size = 1024
else:
size = file_total_size - received_size
data = client.recv(size)
received_size += len(data)
m.update(data)
f.write(data)
#print(file_total_size,received_size)
else:
new_file_md5 = m.hexdigest()
print("file recv done",received_size,file_total_size)
f.close()
server_file_md5 = client.recv(1024)
print("server file md5:",server_file_md5)
print('client file md5:',new_file_md5)
client.close()
本周作业:
client:
import socket
import os,json
import hashlib
class FtpClient(object):
def __init__(self):
self.client = socket.socket()
def cmd_help(self,args):
msg = '''
ls
pwd
cd
get filename
put filename
'''
print(msg)
def connect(self,ip,port):
self.client.connect((ip,port))
def interactive(self):
self.auth()
while True:
cmd = input(">>").strip()
if len(cmd) == 0:continue
cmd_str = cmd.split()[0]
if hasattr(self,'cmd_%s'%cmd_str):
func = getattr(self,'cmd_%s'%cmd_str)
func(cmd)
else:
self.help()
def cmd_put(self,*args):
cmd_split = args[0].split()
if len(cmd_split) > 1:
filename = cmd_split[1]
os.path.isfile(filename)
filesize = os.stat(filename).st_size
msg_dic = {
'action': 'put',
'filename': filename,
'filesize': filesize,
'overridden': True
}
self.client.send(json.dumps(msg_dic).encode('utf-8'))
server_response = self.client.recv(1024)
f = open(filename,'rb')
m = hashlib.md5()
for line in f:
m.update(line)
self.client.send(line)
else:
print("file upload success...")
f.close()
self.client.send(m.hexdigest().encode())
sev_md5_check = self.client.recv(1024)
print(sev_md5_check.decode())
else:
print('file is not exist')
def cmd_get(self):
pass
def auth(self):
pass
class Account(object):
def __init__(self):
pass
ftp = FtpClient()
ftp.connect('localhost',9999)
ftp.interactive()
server:
# Author:Tim Gu
import socket,hashlib
import socketserver,json,os
class MyTCPHandler(socketserver.BaseRequestHandler):
def put(self,*args):
cmd_dic = args[0]
filename = cmd_dic['filename']
filesize = cmd_dic['filesize']
if os.path.isfile(filename):
f = open(filename + ".new",'wb')
else:
f = open(filename,'wb')
self.request.send(b'200,ok')
recived_size = 0
m = hashlib.md5()
while recived_size < filesize:
data = self.request.recv(1024)
m.update(data)
f.write(data)
recived_size += len(data)
else:
f.close()
print("file [%s] has uploaded..."%filename)
recived_md5 = m.hexdigest()
source_md5 = self.request.recv(1024).decode()
if recived_md5 == source_md5:
self.request.send('MD5校验成功'.encode('utf-8'))
else:
self.request.send('MD5校验失败'.encode('utf-8'))
def handle(self):
while True:
try:
print("开始监听!")
self.data = self.request.recv(1024).strip()
print("{} wrote:".format(self.client_address[0]))
print(self.data)
if not self.data:
print(self.client_address,"断开了!")
break
cmd_dic = json.loads(self.data.decode())
action = cmd_dic['action']
if hasattr(self,action):
func = getattr(self,action)
func(cmd_dic)
except ConnectionRefusedError as e:
print(e)
break
if __name__ == "__main__":
HOST,PORT="localhost",9999
server = socketserver.ThreadingTCPServer((HOST,PORT),MyTCPHandler)
server.serve_forever()