with size and targetdir

This commit is contained in:
root 2016-12-19 14:11:17 +08:00
parent 51cb782784
commit d4111cb495
6 changed files with 50 additions and 31 deletions

View File

@ -1,9 +1,9 @@
#include "client.h" #include "client.h"
void transfer(const char *action,const char *host,const char *filepath,const char *uid,const char *gid,const char *position) void transfer(const char *action,const char *host,const char *filepath,const char *targetdir,const char *uid,const char *gid,const char *position,const char *size)
{ {
Py_Initialize(); Py_Initialize();
if(Py_IsInitialized()) if(!Py_IsInitialized())
{ {
printf("can't initialize\n"); printf("can't initialize\n");
} }
@ -14,17 +14,19 @@ void transfer(const char *action,const char *host,const char *filepath,const cha
PyRun_SimpleString("import os"); PyRun_SimpleString("import os");
PyRun_SimpleString("import string"); PyRun_SimpleString("import string");
PyRun_SimpleString("sys.path.append('./')"); PyRun_SimpleString("sys.path.append('./')");
PyObject *pArgs = PyTuple_New(6); PyObject *pArgs = PyTuple_New(8);
PyTuple_SetItem(pArgs,0,Py_BuildValue("s",action)); PyTuple_SetItem(pArgs,0,Py_BuildValue("s",action));
PyTuple_SetItem(pArgs,1,Py_BuildValue("s",host)); PyTuple_SetItem(pArgs,1,Py_BuildValue("s",host));
PyTuple_SetItem(pArgs,2,Py_BuildValue("s",filepath)); PyTuple_SetItem(pArgs,2,Py_BuildValue("s",filepath));
PyTuple_SetItem(pArgs,3,Py_BuildValue("s",uid)); PyTuple_SetItem(pArgs,3,Py_BuildValue("s",targetdir));
PyTuple_SetItem(pArgs,4,Py_BuildValue("s",gid)); PyTuple_SetItem(pArgs,4,Py_BuildValue("s",uid));
PyTuple_SetItem(pArgs,5,Py_BuildValue("s",position)); PyTuple_SetItem(pArgs,5,Py_BuildValue("s",gid));
PyTuple_SetItem(pArgs,6,Py_BuildValue("s",position));
PyTuple_SetItem(pArgs,7,Py_BuildValue("s",size));
pModule = PyImport_ImportModule("client"); pModule = PyImport_ImportModule("client");
if(pModule == NULL) if(pModule == NULL)
{ {
printf("can't python file\n"); printf("can't load module\n");
} }
pFunc = PyObject_GetAttrString(pModule,"entrance"); pFunc = PyObject_GetAttrString(pModule,"entrance");
if(pFunc == NULL) if(pFunc == NULL)

View File

@ -3,5 +3,5 @@
#include <iostream> #include <iostream>
#include <Python.h> #include <Python.h>
using namespace std; using namespace std;
void transfer(const char *action,const char *host,const char *filepath,const char *uid,const char *gid,const char *position); void transfer(const char *action,const char *host,const char *filepath,const char *targetdir,const char *uid,const char *gid,const char *position,const char *size);
#endif #endif

View File

@ -1,9 +1,12 @@
from tornado.httpclient import HTTPRequest, AsyncHTTPClient from tornado.httpclient import HTTPRequest, AsyncHTTPClient
from tornado.simple_httpclient import SimpleAsyncHTTPClient
import tornado.ioloop import tornado.ioloop
import tornado.web import tornado.web
import os,sys import os,sys
from tornado import gen from tornado import gen
from functools import partial from functools import partial
#import time,datatime
total_downloaded = 0 total_downloaded = 0
#action = sys.argv[1] #action = sys.argv[1]
@ -11,12 +14,12 @@ total_downloaded = 0
#uid = sys.argv[3] #uid = sys.argv[3]
#gid = sys.argv[4] #gid = sys.argv[4]
#pos = sys.argv[5] #pos = sys.argv[5]
def geturl(action,host,filepath,uid,gid,pos): def geturl(action,host,filepath,uid,gid,pos,size):
if action=="read": if action=="read":
# uid = sys.argv[3] # uid = sys.argv[3]
# gid = sys.argv[4] # gid = sys.argv[4]
# pos = sys.argv[5] # pos = sys.argv[5]
url = "http://"+host+":8880/read?filepath="+filepath+"&uid="+uid+"&gid="+gid+"&pos="+pos url = "http://"+host+":8888/read?filepath="+filepath+"&uid="+uid+"&gid="+gid+"&pos="+pos+"&size="+size
print(url) print(url)
return url return url
@ -27,25 +30,31 @@ def chunky(path, chunk):
total_downloaded += len(chunk) total_downloaded += len(chunk)
print("chunk size",len(chunk)) print("chunk size",len(chunk))
# the OS blocks on file reads + writes -- beware how big the chunks is as it could effect things # the OS blocks on file reads + writes -- beware how big the chunks is as it could effect things
with open(path, 'a+b') as f: with open(path, 'ab') as f:
f.write(chunk) f.write(chunk)
@gen.coroutine @gen.coroutine
def writer(action,host,filepath,uid,gid,pos): def writer(action,host,filepath,targetdir,uid,gid,pos,size):
print("writer function") print("writer function")
# tornado.ioloop.IOLoop.instance().start() # tornado.ioloop.IOLoop.instance().start()
file_name = os.path.basename(filepath)+"_new" file_name = targetdir+os.path.basename(filepath)
f = open(os.path.basename(filepath)+"_new",'w') if os.path.exists(targetdir):
pass
else:
os.mkdir(targetdir)
f = open(file_name,'w')
f.close() f.close()
request = HTTPRequest(geturl(action,host,filepath,uid,gid,pos), streaming_callback=partial(chunky, file_name)) request = HTTPRequest(geturl(action,host,filepath,uid,gid,pos,size), streaming_callback=partial(chunky, file_name))
http_client = AsyncHTTPClient() AsyncHTTPClient.configure('tornado.simple_httpclient.SimpleAsyncHTTPClient', max_body_size=512*1024*1024)
http_client = AsyncHTTPClient(force_instance=True)
#http_client.configure("tornado.simple_httpclient.SimpleAsyncHTTPClient",max_body_size=524288000)
response = yield http_client.fetch(request) response = yield http_client.fetch(request)
tornado.ioloop.IOLoop.instance().stop() tornado.ioloop.IOLoop.instance().stop()
print("total bytes downloaded was", total_downloaded) print("total bytes downloaded was", total_downloaded)
def entrance(action,host,filepath,uid,gid,pos): def entrance(action,host,filepath,targetdir,uid,gid,pos,size):
print("entrance function") #print("entrance function")
writer(action,host,filepath,uid,gid,pos) writer(action,host,filepath,targetdir,uid,gid,pos,size)
tornado.ioloop.IOLoop.instance().start() tornado.ioloop.IOLoop.instance().start()

Binary file not shown.

View File

@ -1,7 +1,7 @@
#include "client.h" #include "client.h"
int main() int main()
{ {
transfer("read","192.168.83.218","/dev/shm/500M.file","0","0","138"); transfer("read","192.168.83.218","/dev/shm/500M.file","/root/leaf/pytoc/download/","0","0","138","524200000");
return 0; return 0;
} }

View File

@ -13,14 +13,23 @@ def read_in_chunks(infile, chunk_size=1024*1024):
yield chunk yield chunk
chunk = infile.read(chunk_size) chunk = infile.read(chunk_size)
def read_in_chunks_pos(base_dir, pos, chunk_size=1024*1024): def read_in_chunks_pos(base_dir, pos, size, chunk_size=1024*1024):
with open(base_dir, 'rb') as infile: with open(base_dir, 'rb') as infile:
infile.seek(int(pos)) infile.seek(int(pos))
no = int(size) // chunk_size
i = 0
#chunk = infile.read(chunk_size)
#while chunk and i<no:
while i<no:
chunk = infile.read(chunk_size) chunk = infile.read(chunk_size)
while chunk:
yield chunk yield chunk
chunk = infile.read(chunk_size) i = i+1
if (int(size) % chunk_size) != 0:
last = int(size) % chunk_size
chunk = infile.read(last)
yield chunk
infile.close() infile.close()
class ReadRequestHandler(tornado.web.RequestHandler): class ReadRequestHandler(tornado.web.RequestHandler):
@gen.coroutine @gen.coroutine
def get(self): def get(self):
@ -29,10 +38,10 @@ class ReadRequestHandler(tornado.web.RequestHandler):
gid = self.get_argument('gid') gid = self.get_argument('gid')
base_dir = self.get_argument('filepath') base_dir = self.get_argument('filepath')
pos = self.get_argument('pos') pos = self.get_argument('pos')
size = self.get_argument('size')
# Python protocol does not require () on it's if statements like you are # Python protocol does not require () on it's if statements like you are
if base_dir==None or uid==None or gid==None or pos==None: if base_dir==None or uid==None or gid==None or pos==None or size==None:
self.write("Invalid argument!You caused a %d error."%status_code) self.write("Invalid argument!You caused a %d error."%status_code)
exit(1) exit(1)
if os.path.exists(base_dir): if os.path.exists(base_dir):
@ -50,12 +59,11 @@ class ReadRequestHandler(tornado.web.RequestHandler):
exit(1) exit(1)
else: else:
# with open(base_dir, 'rb') as infile: # with open(base_dir, 'rb') as infile:
for chunk in read_in_chunks_pos(base_dir,pos): for chunk in read_in_chunks_pos(base_dir,pos,size):
self.write(chunk) self.write(chunk)
yield gen.Task(self.flush) yield gen.Task(self.flush)
total_sent += len(chunk) total_sent += len(chunk)
print("sent",total_sent) print("sent",total_sent)
self.finish() self.finish()
class ListRequestHandler(tornado.web.RequestHandler): class ListRequestHandler(tornado.web.RequestHandler):
@tornado.web.asynchronous @tornado.web.asynchronous
@ -140,6 +148,6 @@ if __name__ == "__main__":
(r"/list",ListRequestHandler), (r"/list",ListRequestHandler),
(r"/read",ReadRequestHandler) (r"/read",ReadRequestHandler)
]) ])
application.listen(8880) application.listen(8888)
tornado.ioloop.IOLoop.instance().start() tornado.ioloop.IOLoop.instance().start()