宇晖关于客户端与服务端关于上传下载文件的总结:

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()

就这样吧,累了,玩一会儿嘛