NodeMCU 从 Android 应用中发送 GET 请求时,服务器响应异常

我搭建了一个基于 NodeMCU 的小型服务器。从浏览器连接时一切都很好,但从 Android 应用使用 OkHttp 或 Volley 进行连接时,就会出现异常: java.io.IOException: unexpected end of stream on Connection using OkHttp, EOFException using Volley。

这个问题与 EOFException after server responds 很相似,但我没有找到答案。

ESP 服务器代码

srv:listen(80, function(conn)

  conn:on("receive", function(conn,payload)
    print(payload)
    conn:send("<h1> 你好,NodeMCU。</h1>")
  end)
  conn:on("sent", function(conn) conn:close() end)
end)

Android 代码

final RequestQueue queue = Volley.newRequestQueue(this);
final String url = "http://10.42.0.17:80";

final StringRequest request = new StringRequest(Request.Method.GET, url,
            new Response.Listener<String>() {

                @Override
                public void onResponse(String response) {
                    mTemperatureTextView.setText(response.substring(0, 20));
                    System.out.println(response);
                }
            },

            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    System.out.println("Error + " + error.toString());
                    mTemperatureTextView.setText("这没用!");
                }
            }
    );

mUpdateButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            queue.add(request);
        }
    });
点赞
用户131929
用户131929

你返回的不是 HTTP,而是一个对协议不敏感的 HTML 片段。此外,还存在内存泄露问题。

请尝试以下代码:

srv:listen(80, function(conn)

  conn:on("receive", function(sck, payload)
    print(payload)
    sck:send("HTTP/1.0 200 OK\r\nServer: NodeMCU on ESP8266\r\nContent-Type: text/html\r\n\r\n<h1> Hello, NodeMCU.</h1>")
  end)
  conn:on("sent", function(sck) sck:close() end)
end)
  • 你需要返回一些 HTTP 报头,HTTP/1.0 200 OK 和换行符是必须的
  • 每个函数需要使用它自己传递的 socket 实例的副本,可以看到我是如何在两个回调函数中将 conn 重命名为 sck 的,在 https://stackoverflow.com/a/37379426/131929 查看详情
  • 要了解更完整的发送示例,请参阅文档中的 net.socket:send()。当你开始发送超过几个字节时,这将变得更加重要。
2016-05-27 05:10:12