Python使用socket实现文件传输

一、环境说明

    Centos7.6 上测试使用
系统环境 Python版本 目标 CentOS 7.6 python 2.7.5 实现文件传输

思路:

    分为server端和client端,client端发送,server端接收 client端发送文件名,文件数据;server端接收文件名和文件数据

不足:

    未实现加密传输 没有加入校验机制,需要文件传输完成后手动校验文件是否一致

二、代码

  1. socket_client.py
#!/usr/bin/python
# _*_ coding: UTF-8 _*_

import socket
import time, os, base64, os.path
import argparse

def SendFile(s, filename):
    print(Sending %s % filename)
    s.sendall(filename:%s:::: % filename)
    f = open(dirname + filename, rb)
    while True:
        chunk = f.read(chunksize)
        if not chunk:
            f.close()
            print(%s Successfully Sent %s
 %(time.ctime(), filename))
            break
        s.sendall(chunk)
    time.sleep(1)
    s.sendall(EOF)
    s.close()

def main(dirname, IP, Port, MB = 16):
    print(main function is start!)
    for filename in os.listdir(dirname):
        if os.path.isfile(dirname + filename):
            print filename
            s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            s.connect((IP, Port))
            SendFile(s, filename)

if __name__ == __main__:
    parser = argparse.ArgumentParser(description=Manual to the script)
    parser.add_argument(-d,type=str,default=/opt/test/,help=input directory)
    parser.add_argument(--host,type=str,required=True,help=input connecting hosts ip)
    parser.add_argument(-p,type=int,required=True,help=input host port)
    args = parser.parse_args()
    dirname = args.d
    IP = args.host
    Port = args.p
    MB = 16
    chunksize = int(MB*1024*1024)
    main(dirname, IP, Port, MB)
  1. socket_server.py
#!/usr/bin/python
# _*_ coding: UTF-8 _*_

import socket, time, os, base64, re
import argparse

def main(IP, Port, log):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind((IP, Port))
    s.listen(12)
    print Listened on , IP, Port
    reg = re.compile(filename:(.*?)::::)

    while True:
        conn, addr = s.accept()
        print(time.ctime(), Connected from , addr)
        recvd = conn.recv(1024)
        if  recvd:
            ss = reg.findall(recvd)
            filename = ss[0]
            f = open(filename, wb)
            while True:
                data = conn.recv(1024)
                if not data:
                    break
                if data == EOF:
                    f.close()
                    log.write(%s Received %s
%(time.ctime(), filename))
                    log.flush()
                else:
                    f.write(data)
                    f.flush()
            conn.close()
    s.close()


if __name__ == "__main__":
    parser = argparse.ArgumentParser(description=Manual to the script)
    parser.add_argument(--host,type=str,default=localhost,help=input listening host)
    parser.add_argument(-p,type=int,required=True,help=input listening hosts port)
    args = parser.parse_args()
    IP = args.host
    Port =args.p
    log = open(log.txt,w+)
    main(IP, Port, log)

三、测试

两台机器:192.168.0.21 和 192.168.0.27 21作client端,27作server端

27上监听:

python socket_server.py --host 192.168.0.27 -p 12345

21上连接:

python socket_client.py -d /root/test/ --host 192.168.0.27 -p 12345
经验分享 程序员 微信小程序 职场和发展