宇晖关于客户端与服务端关于上传下载文件的总结:
1,首先分别,创建一个函数:,用来创建客户端与服务端。
服务端:
server = socket.socket()
server.bind(('localhost',9999))
客户端:
client = socket.socket()
client.connect(('localhost', 9999))
这个是固定格式,基础中的基础,在python中相当于1+1等于几。
2,然后让服务端不断地接受多个客户端
while True:
server.listen()
conn, addr = server.accept()
print("new addr:",addr)
套接字与地址,需要尤为注意。
3,让服务端不断地接受来自客户端的消息。
while True:
data = conn.recv(1024)
Print(data)
if not data:
print("客户端已断开。。。")
Break
4,通过发送消息,确认两者连接无误后,服务端开始接受来自客户端的消息
cmd, filename = data.decode().split()
print(filename)
5,通过判断cmd,来寻求客户端是上传还是下载
if cmd == 'get':
get(filename,conn)
elif cmd == 'put':
put(filename,conn)
elif cmd == 'ls':
ls(filename,conn)
6,紧接着,还有最最最重要的是,不要忘记关闭
server.close()
7,修饰客户端,不断发送消息,
while True:
msg = input(">>:").strip()
if len(msg) == 0:
continue
client.send(msg.encode())
8,自身不断地对自身的消息进行处理判断是调用哪个函数
cmd,filename = msg.split()
if cmd == 'get':
get(filename,client)
elif cmd == 'put':
put(filename,client)
else:
ls(filename,client)
client.close()#注意关闭客户端
好了,这是第一部分,我们需要写的函数,用来上传和下载
现开始第二部分的学习,进行文件的发送,和接受,先来看服务端
1,服务端收到信息之后,首先要的判断文件存不存在,如果存在才能继续进行后面操作,
def get(filename,conn):
if os.path.isfile(filename):
2,接着都是套路了
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())
3,接着判断客户端
def get(filename,client):
ser_respondse = client.recv(1024)
client.send("准备好了接收".encode())
4,按照上节知识点,套路继续
if ser_respondse.decode()!= '0':
file_size = int(ser_respondse.decode())
f = open(filename + '_new.txt', "wb")
re_size = 0
cm = hashlib.md5()
while re_size < file_size:
if file_size - re_size > 1024:
size = 1024
else:
print("the last size:",size)
data = client.recv(size)
recv_size += len(data)
f.write(data)
m.update(data)
这是下载文件的原理,又继续重复了一遍,
下面是源代码
服务端
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.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) lm=0 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 lm=lm+size data = conn.recv(size) re_size += len(data) f.write(data) cm.update(data) conn.send(str(lm).encode()) conn.send(cm.hexdigest().encode()) print("recv over..") f.close() 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) 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 print("the last size:", size) data = client.recv(size) re_size += len(data) f.write(data) cm.update(data) else: client_md5 = cm.hexdigest() print("文件已下载完毕啦啦啦") print("total size:", file_size, "had been received:",re_size) server_md5 = client.recv(1024) print("server md5:", client_md5, "server md5:", server_md5.decode()) f.close() # #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) size=client.recv(1024) print("文件已上传了:", size.decode()) f.close() time.sleep(0.5) server_md5 = client.recv(1024) client_md5 = m.hexdigest() print("server md5:", client_md5, "server md5:", server_md5.decode()) print("文件上传成功了") 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) client.close() if __name__ == '__main__':main()
就这样吧,累了,玩一会儿嘛