1

我的 Python 脚本,带有以下行:

from requests import post

...
while(1):

   result = readSensors().result

   payload["z"] = (result['zforce'])
   payload["x"] = (result['xforce'])
   payload["y"] = (result['yforce'])
   payload["light"] = (result['light'] )
   payload["pitch"] = ( result["pitch"] )
   payload["azimuth"] = ( result["azimuth"] )
   payload["roll"] = ( result["roll"] )

   post(SERVER, data = payload )
   sleep(0.02)

到我的 Heroku webapp 服务器会导致 Python 错误httplib.IncompleteRead: IncompleteRead(0 bytes read)错误。


web.js文件如下所示:

var server = http.createServer(function(request, response){     
  if (request.method == 'POST'){
            var body = '';
            request.on('data', function (data) {
                body += data;
            });
            request.on('end', function () {
                //send data to clients.
                io.sockets.emit( 'data', parse(body) );

            });
    response.end()

}
server.listen(process.env.PORT || 5000);


var io = io.listen(server);

io.set('log level', 1);
io.configure(function () { 
  io.set("transports", ["xhr-polling"]); 
  io.set("polling duration", 10);  
});
4

1 回答 1

1

这更有可能是您的“webapp 服务器”而不是您的客户端代码的问题,因此您必须包含有关服务器的更多信息。

造成这种情况的一个常见原因是,您使用 发回了响应Transfer-Encoding: chunked,但没有提供正确编码的响应正文。

例如,以下服务器代码...

from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler

class MyRequestHander(BaseHTTPRequestHandler):

    def do_GET(self):
        self.send_bogus_response()

    def do_POST(self):
        self.send_bogus_response()

    def send_bogus_response(self):
        self.send_response(200)
        self.send_header('Content-Type', 'text/plain')
        self.send_header('Connection', 'close')
        self.send_header('Transfer-Encoding', 'chunked')
        self.end_headers()

server = HTTPServer(('', 8000), MyRequestHander)
server.serve_forever()

requests...使用库调用时会导致相同的错误...

>>> import requests
>>> requests.post('http://localhost:8000', data={'foo':'bar'})
...
httplib.IncompleteRead: IncompleteRead(0 bytes read)

显然,如果服务器没有读取整个请求正文,也可能会发生此问题,并且可能还有其他一些原因导致这种情况发生,但如果不了解更多关于服务器设置。


更新

代码有很多问题web.js,但主要问题是您在读取 ​​POST 数据之前发回了响应。response.end()需要进入request.on('end', ...)函数内部,否则您的任何request.on(...)函数都不会被调用。

以下代码应消除该问题...

var server = http.createServer(function(request, response)
{
    if (request.method == 'POST')
    {
        var body = '';

        request.on('data', function(data)
        {
            body += data;
        });

        request.on('end', function()
        {
            //send data to clients.
            io.sockets.emit('data', parse(body));
            response.end();
        });
    }
});

...虽然我不确定该parse(...)功能应该是什么。

于 2013-06-09T18:08:13.090 回答