使用HTTP而不是普通套接字(Android上的Java)通过Wi-Fi网络将大型(50-200 MB)文件[文件在SD卡上]从Android设备发送到Linux服务器是否存在大量开销.
在我目前的原型中,我使用CherryPy-3.2.0来实现我的HTTP服务器.我在Nexus上运行Android 2.3.3作为我的客户端.
目前它需要约100秒**(在较慢的网络18 Mbps*上)和约50秒(在更快的54 Mbps*上)Wi-Fi网络上传50 MB二进制文件.
注意:
*我WifiInfo.getLinkSpeed()用来衡量网络链接速度
**这是之前和之后的时差HTTPClient.execute(postRequest)
关于其他昂贵的操作的任何其他想法可能在网络之外的总时间中占很大比例并且如何减少这个时间将是值得赞赏的.
谢谢.
编辑 - Android上的HTTP发布代码
private void doHttpPost(String fileName) throws Exception{
HttpParams httpParameters = new BasicHttpParams();
// Set the timeout in milliseconds until a connection is established.
int timeoutConnection = 9000000;
HttpConnectionParams.setConnectionTimeout(httpParameters, timeoutConnection);
// Set the default socket timeout (SO_TIMEOUT)
// in milliseconds which is the timeout for waiting for data.
int timeoutSocket = 9000000;
HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);
HttpClient client = new DefaultHttpClient(httpParameters);
client.getParams().setParameter(ClientPNames.COOKIE_POLICY, CookiePolicy.RFC_2109); …Run Code Online (Sandbox Code Playgroud) 我在使用CherryPy框架访问http请求的主体时遇到了一些问题.我在带有Python3和Aptana Web Studio IDE的x86_64 Arch Linux机器上使用CherryPy 3.2.0.
当我尝试通过通常的cherrypy.request.body.read()访问请求的正文时,我收到错误
File "/usr/lib/python3.2/site-packages/cherrypy/_cpreqbody.py", line 450, in read
return self.fp.read(size, fp_out)
TypeError: read() takes at most 2 positional arguments (3 given)
Run Code Online (Sandbox Code Playgroud)
导致错误的代码是:
import cherrypy
class Test:
def index(self):
print(cherrypy.request.body.read())
#print(cherrypy.request.body.readline()) <- this works!
return 'HelloWorld'
index.exposed = True
if __name__ == '__main__':
cherrypy.quickstart(Test())
Run Code Online (Sandbox Code Playgroud)
但是,使用
cherrypy.request.body.readline() or cherrypy.request.body.readlines(n)
Run Code Online (Sandbox Code Playgroud)
代替
cherrypy.request.body.read()
Run Code Online (Sandbox Code Playgroud)
我可以很好地浏览请求的正文.我试着谷歌搜索解决方案,但没有找到.考虑到我是一个完全蟒蛇新手,一定有我做错了什么,但是什么?
提前感谢您的宝贵帮助.
我最近开始了一个将我们的web应用程序从apache + Mod_python迁移到cherry-py的项目.
我仍然需要做很多事情,但是现在,CherryPy的会议给我带来了一些麻烦.
我的第一个问题是它们是如何工作的?
在Mod_python中,我们执行以下操作:
...
from mod_python import Session
sess = Session.Session(req, timeout = 60*60, lock=0)
#req is the request page object.
Run Code Online (Sandbox Code Playgroud)
从CherryPy文档来看,启动会话所需要做的就是通过添加如下内容来修改配置:
cherrypy.config.update({
'tools.sessions.on': True,
'tools.sessions.storage_type': 'ram'})
Run Code Online (Sandbox Code Playgroud)
以上默认为60分钟的时间(虽然您可以手动设置自己的),但是如果我想销毁该会话并创建一个新会话呢?做,我打电话给cherrypy.lib.sessions.expire()任意文件然后再做cherrypy.config.update一次?或者,CherryPy会自行创建一个新会话吗?如果我想使用不同的到期时间进行新会话怎么办?
注意:当我说任意文件时,我的意思是一个没有运行CherryPy的文件(我的"配置"文件导入并从我们的其他页面获取html,就像Mod_Python附带的标准Publisher一样).
我尝试制作一个快速的小测试文件:
import cherrypy
from cherrypy.lib import sessions
def index(sid=0, secret=None, timeout=30, lock=1):
cherrypy.session['test'] = 'test'
cherrypy.lib.sessions.expire()
return cherrypy.session.get('test','None')
Run Code Online (Sandbox Code Playgroud)
最终结果是"测试"仍显示在屏幕上.是否发生这种情况是因为客户端会话已过期,但本地会话仍有数据?在这种情况下,我如何检查会话是否过期?
抱歉这个令人困惑的问题,但我很困惑.
感谢你的帮助!
问题很简单,我们希望CherryPy不记录被调用的特定公开方法/ API的访问日志.
基本上,当调用此API时,URL的查询字符串中有一些参数非常敏感,如果泄露,则会暴露潜在的安全性.当然这是一个/ GET请求,不幸的是,这是参数传递的唯一方式,因为它是从外部服务到该Web服务器的重定向(302).
如果它不记录URL,那也可以达到目的.
那么,有没有一种方法可以通过API,URL等来过滤访问日志中的日志消息?
在此先感谢您的帮助.
我有一个小巧的Web服务器,需要能够通过http发布接收大文件。我目前有工作,但是一旦发送的文件太大(大约200mb),它就会失败。我正在使用curl发送测试帖子请求,当我尝试发送太大的文件时,curl吐出“随请求发送的实体超过了允许的最大字节数”。到处搜寻,这似乎是cherrypy的错误。
所以我猜要发送的文件需要分块发送吗?我用mmap尝试了一些东西,但是我做不到。处理文件上传的方法是否也需要能够接受大块数据?
我对不同的Web框架(Django,web.py,Pyramid和CherryPy)有一些经验,我想知道哪一个更容易,希望更清洁,将路由调度程序实现到基于的不同"视图/处理程序" "Accept"标头和HTTP方法,例如:
Accept: application/json
POST /post/
Run Code Online (Sandbox Code Playgroud)
处理不同于:
Accept: text/html
POST /post/
Run Code Online (Sandbox Code Playgroud)
因此,请求被路由到MIME"application/json"和HTTP方法"POST"的相应处理程序的特定视图.
我确实知道如何在CherryPy中实现类似的东西,但我失去了使用CherryPy工具进行请求的内部重定向,因为我直接调用特定方法而不是调度程序自动调用.另一个选择是从头开始实现一个全新的调度程序,但这是最后一个选项.
我知道在url中使用扩展名的替代方法,/post.json或者/post/.json,但我希望保留相同的网址?
我在webfactional上运行cherrypy.我有一个严重的内存泄漏问题,我想隔离其原因.如何在单个线程/进程上运行cherrypy?
上下文:访问分配大量数据列表的页面会增加python进程的内存使用量.内存使用率再也不会下降.我怀疑cherrypy使用多个执行线程的事实是问题,但我没有办法禁用该功能以隔离我的问题.
我的site.py文件的相关部分:
cherrypy.config.update({
'environment': 'production',
'log.screen': False,
'log.error_file':'cperror.log',
'server.socket_host': '127.0.0.1',
'server.socket_port': 31266,
})
cherrypy.quickstart(Root())
Run Code Online (Sandbox Code Playgroud)
我搜索了很多解决问题的方法,但我什么都没有.我也浏览过官方的CherryPy文档,但无济于事.
我正在使用cherrypy 3.2和python 2.7
我有一个小网络应用程序(只有 1 页),允许用户输入和选择一些选项。输入的文本和选择将以表格的形式显示在另一个 div 中。您可能需要参考此处的示例:http : //jsfiddle.net/xaKXM/5/
在此小提琴中,您可以输入任何内容,单击submit后将获得文本输入并将它们附加到另一个表中#configtableTable
$('#labels #labelTable tr:last').after(addmore);
$('#configtable #configtableTable tr:last').after(displaymore);
Run Code Online (Sandbox Code Playgroud)
我正在使用cherrypy作为迷你网络服务器(因此主要代码是用python编写的),我知道它在session 这里,但我根本不知道如何使用它,因为给出的示例并不是我真正想要看到的.
仅供参考,我根本没有使用 PHP,所有内容都在一个页面中。我只是显示和隐藏它们。但我希望页面即使在刷新后也能保持显示#configtableTable和隐藏状态#labelTable。请注意,小提琴只是网络应用程序的一部分,它只会在从另一台设备得到回复后才会显示所有这些。
不确定 cookie,因为我发现的所有链接似乎都已损坏。如何jQuery的会议?它适用于我的情况吗?不过我需要一些应用示例:(
好的,总结一下我的问题: 1. 我可以在刷新后保存页面状态吗?如何?上面提到的哪些方法值得一试?有什么例子可以参考吗?或任何其他建议?2.我可以在到达页面后简单地禁用刷新或返回吗?
提前谢谢大家:)
我一直在尝试对我的CherryPy Web服务器进行性能分析,但是该文档缺少如何设置的详细信息。我了解我应该能够cherrypy.lib.profiler用作中间件来安装我的初始服务器。现在,我有如下代码:
server_app = ServerClass()
cherrypy.tree.mount(server_app, '/', '/path/to/config/file.cfg')
cherrypy.engine.start()
cherrypy.engine.block()
Run Code Online (Sandbox Code Playgroud)
我想挂载性能分析中间件,似乎需要以下内容:
from cherrypy.lib import profiler
server_app = ServerClass()
server_cpapp = cherrypy.Application(server_app, '/', '/path/to/config/file.cfg')
server_profile_cpapp = profiler.make_app(server_cpapp, '/home/ken/tmp/cprofile', True)
#cherrypy.tree.mount(server_profile_cpapp)
cherrypy.tree.graft(server_profile_cpapp)
cherrypy.engine.start()
cherrypy.engine.block()
Run Code Online (Sandbox Code Playgroud)
出于某种原因,cherrypy.tree.mount它不起作用,但是,如果我使用cherrypy.tree.graft全部,似乎一切正常(我可以像往常一样向服务器发出请求)
但是,上面的代码cp_0001.prof在下面生成一个文件/home/ken/tmp/cprofile,我不确定如何解释它。我尝试使用pyprof2calltree将数据读取到KCacheGrind中,但是遇到解析错误。我正在做的事情看起来是否正确,如果可以,我该如何解释输出文件?
我有一个使用瓶子框架开发的python web应用程序.我的瓶子应用程序是Web API,提供返回JSon数据的方法,因此不需要静态内容.我正在尝试使用CherryPy服务器将其部署到生产中,该服务器应该对生产应用程序很健壮.
我的web_api.py文件(我的瓶子应用程序)看起来像这样:
from bottle import Bottle, request
app = Bottle()
@app.get('/stuff')
def do_stuff():
'''
Method that does stuff.
'''
stuff = {'data': 'some data'}
# Return the environment info as Json data
return stuff
Run Code Online (Sandbox Code Playgroud)
我有一个server.py文件来启动CherryPy服务器上的Bottle应用程序,如下所示:
from my_package.web_api import app
from cherrypy.wsgiserver import CherryPyWSGIServer
server = CherryPyWSGIServer(
('0.0.0.0', 80),
app,
server_name='My_App',
numthreads=30)
server.start()
Run Code Online (Sandbox Code Playgroud)
所以当我使用这个命令运行我的服务器时:
python server.py
Run Code Online (Sandbox Code Playgroud)
我的服务器已成功启动,并按预期开始在端口80中进行侦听.但是,一旦我启动我的Web服务器,我就无法阻止它.我尝试过Ctrl + C,它与开发服务器一起使用但在这里没有效果.我是以正确的方式启动服务器吗?一旦它运行,我该如何阻止它?这是通过CherryPy启动Bottle应用程序的正确方法吗?
顺便说一下,我在Windows 8中运行python 2.7.