java - Why Python http server cause android VolleyError -


i have following simple python 3.4 script:

listen_port = 7000  class myhandler(http.server.simplehttprequesthandler):      def do_get(self):         print("do get")         self.send_response(200, "ok")    def run():      handler = myhandler     print("server started")     httpd = socketserver.tcpserver(("0.0.0.0", listen_port), handler)      try:         print("serving @ port", listen_port)         httpd.serve_forever()     except keyboardinterrupt:         httpd.socket.close()   run() 

when call android:

final stringrequest request = new stringrequest(request.method.get, context.getstring(r.string.domain)+"/", new response.listener<string>() {         @override         public void onresponse(string s) {          }     }, new response.errorlistener() {         @override         public void onerrorresponse(volleyerror volleyerror) {              log.e(tag, "can not send token" + volleyerror);             toast.maketext(context, "can not send", toast.length_long).show();         }     });      volley.newrequestqueue(context).add(request); 

android: see toast "can not send" , on logcat console have following information:

06-27 18:05:16.332  28946-28946/com.example.code e/network_connector﹕ can not send token code:com.android.volley.noconnectionerror: java.io.eofexception 

python:

192.168.12.246 - - [27/jun/2014 18:15:55] "get / http/1.1" 200 - 

what wrong python script?

what wrong python script ?

it somehow work python3.0-3.2 won't work python3.3+

from send_response documentation

changed in version 3.3: headers stored internal buffer , end_headers() needs called explicitly.

in current setup header part of http answer not sent.

so right way in python3.3+

def do_get(self):      print("do get")     self.send_response(200, "ok")     self.end_headers()      self.wfile.write(b"response body\n") #optional 

but there several thing improved in script

  • use http.server.basehttprequesthandler instead of http.server.simplehttprequesthandler because simplehttprequesthandler add magic basehttprequesthandler process , head request. override do_get, replace behavior of simplehttprequesthandler don't do_head, server answer head requests simplehttprequesthandler not idea
  • httpd.server_close() instead httpd.socket.close() if don't change thing noop in current python

adding import @ top of script , voilĂ  full working script

import http.server listen_port = 7000  class myhandler(http.server.basehttprequesthandler):      def do_get(self):          print("do get")         self.send_response(200, "ok")         self.end_headers()          self.wfile.write(b"response body\n") #optional   def run():      handler = myhandler     print("server started")     httpd = http.server.httpserver(("0.0.0.0", listen_port), handler)      try:         print("serving @ port", listen_port)         httpd.serve_forever()     except keyboardinterrupt:         httpd.server_close()   if __name__ == "__main__":     run() 

Comments

Popular posts from this blog

javascript - RequestAnimationFrame not working when exiting fullscreen switching space on Safari -

Python ctypes access violation with const pointer arguments -