Python通过Socket实现文件传输
2018-03-15 19:41
441 查看
客户端# -*- 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}'
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}'
相关文章推荐
- 树莓派小车By 树莓派爱好者ITJoker(通过python socket通信+mjpg实现树莓派视频小车)
- 通过python下的socket实现组播数据的发送和接收
- python通过socket模拟实现简单的ssh功能
- Python使用socket实现简单的文件传输并校验
- Python socket实现文件传输的服务端与客户端
- python使用TCP实现文件传输(CentOS6.4,python2.6测试通过)
- 通过Socket实现文件传输(Java)
- python通过socket实现多个连接并实现ssh功能详解
- Java通过Socket编程实现文件传输
- python通过shutil实现快速文件复制的方法
- 用Python socket实现一个简单的http服务器(post 与get 的区别)、CGIHTTPServer 简单应用
- Python基于Socket实现简单聊天室
- [读书笔记]python3.5实现socket通讯(UDP)
- python通过zlib实现压缩与解压字符串的方法
- Python实现的查询mysql数据库并通过邮件发送信息功能
- Python实现socket通信 (tcp)
- Python实现ASP+ACCESS注入,不用SOCKET
- 【工作总结】通过SWIG实现 python 和 c++ 互相通信
- python3 socket实现
- scala通过akka的actor实现socket http server(NIO非阻塞模式)