gpt4 book ai didi

java - 为什么Python http服务器会导致android VolleyError

转载 作者:行者123 更新时间:2023-12-01 12:48:27 25 4
gpt4 key购买 nike

我有以下简单的 Python 3.4 脚本:

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 at port", LISTEN_PORT)
httpd.serve_forever()
except KeyboardInterrupt:
httpd.socket.close()


run()

当我从 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:我看到 Toast “无法发送”,并且在 logcat 控制台上我有以下信息:

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 -
DO GET

Python 脚本有什么问题?

最佳答案

Python 脚本有什么问题?

它可以在 python3.0-3.2 上工作,但不能在 python3.3+ 上工作

来自send_response documentation

Changed in version 3.3: Headers are stored to an internal buffer and end_headers() needs to be called explicitly.

在当前设置中,http 应答的 header 部分根本不会发送。

所以在 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

但是您的脚本中有几处可以改进

  • 使用http.server.BaseHTTPRequestHandler而不是http.server.SimpleHTTPRequestHandler,因为SimpleHTTPRequestHandler为BaseHTTPRequestHandler添加了一些魔法来处理GET和HEAD请求。当您覆盖 do_GET 时,您替换了 SimpleHTTPRequestHandler 的行为,但由于您不为 do_HEAD 执行此操作,您的服务器将响应 HEAD 请求,因为它将是 SimpleHTTPRequestHandler 这不是一个好主意
  • httpd.server_close() 而不是 httpd.socket.close() 即使这不会改变太多,因为它基本上是当前 python 中的一个 noop

在脚本顶部添加导入,然后查看完整的工作脚本

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 at port", LISTEN_PORT)
httpd.serve_forever()
except KeyboardInterrupt:
httpd.server_close()


if __name__ == "__main__":
run()

关于java - 为什么Python http服务器会导致android VolleyError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24456355/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com