python通过socket传文件_Python通过Socket实现文件传输

这篇博客介绍了如何使用Python的socket模块实现文件的发送和接收。客户端首先读取文件并计算其MD5值,然后连接到服务器指定的IP和端口,发送文件信息和数据。服务端接收到文件信息后,开始接收文件数据并写入到本地,直到文件传输完成。
摘要由CSDN通过智能技术生成

客户端# -*- coding: utf-8 -*-

import socket

import argparse

import os

import hashlib

import pickle

def parse_args():

parser = argparse.ArgumentParser()

parser.add_argument("-f","--file",help="the file you want to send")

parser.add_argument("-i","--ip",help="target's ip address")

args = parser.parse_args()

filePath = args.file

ip = args.ip

print "File path : %s" % filePath

return filePath,ip

def read_file(filePath,eachCount):

f = open(filePath,'r')

size = os.path.getsize(filePath) * 1024

print "Sent file size:",size

data = ""

tmp = f.read(eachCount)

data += tmp

while len(tmp) >0 :

tmp = f.read(eachCount)

data += tmp

f.close()

# print data

md5_data = hashlib.md5(data).hexdigest()

info = {

'size':size,

'md5':md5_data,

'name':os.path.basename(filePath)

}

return data,info

if __name__ == "__main__":

filePath,ip = parse_args()

d,info = read_file(filePath,1024)

s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

if not ip :

ip = "127.0.0.1"

s.connect((ip,9999))

print s.recv(1024)

s.sendall("#info#"+pickle.dumps(info))

print s.recv(1024)

s.send("#file#"+d)

print s.recv(1024)

s.send('exit')

print s.recv(1024)

s.close()

服务端:# -*- coding: utf-8 -*-

import socket

import time

import argparse

import threading

import os

import hashlib

import pickle

def tcplink(sock,addr):

print "Now accept new connection from %s:%s..." %addr

sock.send("ok")

while True:

data = sock.recv(2048)

if data == "exit" or not data:

break

if data.startswith("#info#"):

str_info = data[6:]

info = pickle.loads(str_info)

print info

sock.send("ok")

size = info['size']

d = sock.recv(4096)

print "Rec:",d

if d.startswith("#file#"):

if len(d) >= 4096:

d = d[6:]

write_file(info['name'],d)

while size >0 :

if size >= 4096:

print size

d = sock.recv(4096)

write_file(info['name'],d)

size -= 4096

else:

print "end",size

d = sock.recv(size)

size = 0

write_file(info['name'],d)

else:

write_file(info['name'],d[6:])

sock.send("ok")

sock.send("bye")

sock.close()

print "Now disconnect socket from %s:%s..." %addr

def write_file(name,data):

f = open("recv/%s"%name,"a+")

f.write(data)

print "recv/%s"%name

f.close()

if __name__ == "__main__":

s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

s.bind(("127.0.0.1",9999))

s.listen(5)

print "Waiting for connection..."

while True:

sock,addr = s.accept()

t=threading.Thread(target=tcplink(sock,addr))

Usage:python rec.py

python send.py -f '{file path}' -i '{ip address}'

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值