python socket 实现简单的文件上传和下载(ftp)

利用socket,基本的文件操作,使用json,MD5验证。代码如下:

服务端:

import socket,os,hashlib,time,json
def get(filename,conn):
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())
conn.recv(1024)
for line in f:
m.update(line)
conn.send(line)
f.close()
print("md5:", m.hexdigest())
time.sleep(0.5)
conn.recv(1024)
conn.send(m.hexdigest().encode())
print("send done")
else:
conn.send('0'.encode())

def put(filename,conn):
f = open(filename+'1','wb')
send_size = conn.recv(1024)
file_size = int(send_size.decode())
re_size = 0
conn.send("dsd".encode())
cm = hashlib.md5()
while re_size < file_size:
if file_size - re_size > 1024:
size = 1024
else:
size = file_size - re_size
data = conn.recv(size)
re_size += len(data)
f.write(data)
cm.update(data)
sm = conn.recv(1024)
if cm.hexdigest() == sm.decode():
conn.send("1".encode())
print("recv over..")
f.close()
def ls(filename,conn):
if filename == 'server':
cm = conn.recv(1024)
res = os.listdir()
res = json.dumps(res)
conn.send(res.encode())



def main():
server = socket.socket()
server.bind(('localhost', 9999))
while True:
server.listen()
conn,addr = server.accept()
print("addr:",addr)
while True:
data = conn.recv(1024)
print(data)
if not data:
print("客户端已断开")
break
cmd,filename = data.decode().split()
if cmd == 'get':
get(filename,conn)
elif cmd == 'put':
put(filename,conn)
elif cmd == 'ls':
ls(filename,conn)
server.close()

if __name__ == '__main__':
main()
客户端:
  
import socket,os,hashlib,time,json

def get(filename,client):
ser_respondse = client.recv(1024)
client.send("准备好了接收".encode())
if ser_respondse.decode()!= '0':
file_size = int(ser_respondse.decode())
f = open(filename + '_jjjjnew.txt', "wb")
re_size = 0
cm = hashlib.md5()
while re_size < file_size:
if file_size - re_size > 1024:
size = 1024
else:
size = file_size - re_size
data = client.recv(size)
re_size += len(data)
f.write(data)
cm.update(data)
client.send("dsds".encode())
sm = client.recv(1024)
if cm.hexdigest() == sm.decode():
print("load success")
f.close()
else:
print("no this file..")

def put(filename,client):
f = open(filename, "rb")
m = hashlib.md5()
file_size = os.stat(filename).st_size
client.send((str(file_size)).encode())
client.recv(1024)
for line in f:
m.update(line)
client.send(line)
f.close()
time.sleep(0.5)
client.send(m.hexdigest().encode())
resul = client.recv(1024)
if resul.decode()=='1':
print("send successed")
def ls(filename,client):
if filename=='client':
d = os.listdir()
for i in d:
print(i)
elif filename=='server':
client.send("ls".encode())
res = client.recv(1024)
data = json.loads(res.decode())
for i in data:
print(i)
else:
print("input client or server")
def main():
client = socket.socket()
client.connect(('localhost', 9999))
while True:
msg = input(">>:").strip()
if len(msg) == 0:
continue
client.send(msg.encode())
cmd,filename = msg.split()
if cmd == 'get':
get(filename,client)
elif cmd == 'put':
put(filename,client)
else:
ls(filename,client)
client.close()

if __name__ == '__main__':
main()
posted @ 2017-10-24 20:02  Jcp_Lee  阅读(1433)  评论(0编辑  收藏  举报