设为首页 收藏本站
查看: 720|回复: 0

[经验分享] Python使用socket实现简单的文件传输并校验

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2016-2-2 08:43:13 | 显示全部楼层 |阅读模式
因为工作需要,要在两台设备之间进行压力测试。即A设备不断往B设备发送文件,B设备接收文件后校验文件是否正确接收。       用Python的socket模块写了简单的Server和Client脚本。Server负责监听端口,接收Client发来的文件并做MD5校验,确认接收的文件是否准确无误。Client端负责向Server发送文件及文件的MD5值。
       文件名通过Client发送特定字符串提取,文件结束符合通过检测'EOF'字符实现。实际运行过程中,发现总是会有误判,把结束符'EOF'错误写入文件了。希望有大神不吝赐教!!

Socket_Server.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#!/usr/bin/python
# -*- coding: utf-8 -*-
# Python:          2.7
# Platform:        Linux
# Author:          wucl(wucl-20@163.com)
# Program:         Socket_Server监听网络端口,接收Client发来的文件
# Version:         2.0
# History:         2016.1.28
#                  2016.2.1   接收Client发来的文件并做MD5校验

import socket, time, hashlib, os, base64, re

def CalcMD5(fineName, block_size=64 * 1024):
  with open(fineName, 'rb') as f:
    md5 = hashlib.md5()
    while True:
      data = f.read(block_size)
      if not data:
        break
      md5.update(data)
    retmd5 = md5.hexdigest()
    print(retmd5)
    return retmd5

def main(IP, Port, log, error_log):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind((IP, Port))
    s.listen(12)
    print 'Listened on ', socket.gethostname(), 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][0]
            md5 = ss[0][1]
            f = open(filename, 'wb')
            while True:
                data = conn.recv(1024)
                if not data:
                    break
                if data == 'EOF':
                    f.close()
                    log.write('%s Received %s\n'%(time.ctime(), filename))
                    log.flush()
                    if CalcMD5(filename) == md5:
                        print('%s Received Successfully!\n' %filename)
                    else:
                        error_log.write('%s %s Recevied failed\n'%(time.ctime(), filename))
                        error_log.flush()
                        print(CalcMD5(filename))
                else:
                    f.write(data)
                    f.flush()
            conn.close()
    s.close()


if __name__ == "__main__":
    IP = ''
    Port = 12345
    log = open('log.txt','w+')
    error_log = open('error_log.txt','w+')
    main(IP, Port, log, error_log)




Socket_Client.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#!/usr/bin/python
# -*- coding: utf-8 -*-
# Python:          2.7
# Platform:        Linux
# Author:          wucl(wucl-20@163.com)
# Program:         Socket_Client连接网络端,并向网络端发送文件。
# Version:         2.0
# History:         2016.1.28
#                  2016.2.1    Client向Server端发送文件及文件的MD5值

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


def CalcMD5(fineName, block_size=64 * 1024):
  with open(fineName, 'rb') as f:
    md5 = hashlib.md5()
    while True:
      data = f.read(block_size)
      if not data:
        break
      md5.update(data)
    retmd5 = md5.hexdigest()
    print(retmd5)
    return retmd5

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

def main(dirname, IP, Port, MB = 1024):
    for filename in os.listdir(dirname):
        if os.path.isfile(filename):
            s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            s.connect((IP, Port))
            SendFile(s, filename)


if __name__ == '__main__':
    dirname = '/root/test/'
    IP = '10.88.106.200'
    Port = 12345
    MB = 1024
    chunksize = int(MB*1024*1024)
    main(dirname, IP, Port, MB)



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-172615-1-1.html 上篇帖子: 关于python函数的默认参数,可变参数,关键字参数 下篇帖子: python sys模块
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表