python socket file transfer

后端 未结 5 1772
逝去的感伤
逝去的感伤 2020-12-30 09:16

I\'m trying to write transfer files or chunks of data over a socket. I feel as if I\'m reinventing the wheel, but my searches for a simple solution have failed (everything I

5条回答
  •  轻奢々
    轻奢々 (楼主)
    2020-12-30 09:30

    U may look at this implementation. It also take care of if the file is in a sub-directory. Here is the link!

    server

    import socket
    import os
    
    print('Waiting for clinet to connect...')
    c = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    c.bind(('', 1234))
    c.listen(1)
    s, a = c.accept()
    
    print('Connected. Going to receive file.')
    s.sendall('getfilename')
    filename = s.recv(1024)
    if '/' in filename:
        dir = os.path.dirname(filename)
        try:
            os.stat(dir)
        except:
            print('Directory does not exist. Creating directory.')
            os.mkdir(dir)
    f = open(filename, 'wb')
    print('Filename: ' + filename)
    
    while True:
        s.sendall('getfile')
        size = int(s.recv(16))
        print('Total size: ' + str(size))
        recvd = ''
        while size > len(recvd):
            data = s.recv(1024)
            if not data: 
                break
            recvd += data
            f.write(data)
            #print(len(recvd))
        break
    s.sendall('end')
    print('File received.')
    
    s.close()
    c.close()
    f.close()
    

    client

    import socket
    import sys
    
    if len(sys.argv) > 1 :
        print('Trying to connect...')
        s = socket.socket()
        s.connect(('127.0.0.1', 1234))
    
        print('Connected. Wating for command.')
        while True:
            cmd = s.recv(32)
    
            if cmd == 'getfilename':
                print('"getfilename" command received.')
                s.sendall(sys.argv[1])
    
            if cmd == 'getfile':
                print('"getfile" command received. Going to send file.')
                with open(sys.argv[1], 'rb') as f:
                    data = f.read()
                s.sendall('%16d' % len(data))
                s.sendall(data)
                print('File transmission done.')
    
            if cmd == 'end':
                print('"end" command received. Teminate.')
                break
    

提交回复
热议问题