2016-05-26 2 views
0

Я сделал небольшой сервер на основе NodeMCU. Все работает хорошо, когда я связываюсь с браузером, но проблема начинается, когда я пытаюсь подключиться из Android-приложения uisng OkHttp или Volley, я получаю исключения. java.io.IOException: неожиданный конец потока при подключении с использованием OkHttp, EOFException с использованием Volley.Ошибка сервера NodeMCU при отправке запроса GET из приложения Android

Проблема очень похожа на это EOFException after server responds, но ответ не найден.

код сервера ESP

srv:listen(80, function(conn) 

    conn:on("receive", function(conn,payload) 
    print(payload) 
    conn:send("<h1> Hello, 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("That didn't work!"); 
       } 
      } 
    ); 

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

ответ

2

То, что вы отправляете обратно, не является 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 и новой строки являются обязательными
  • каждая функция должна использовать собственный экземпляр передается экземпляр сокета, см как я переименовал conn к sck в двух функций обратного вызова см https://stackoverflow.com/a/37379426/131929 подробности

Для более полного примера отправки см. net.socket:send() in the docs. Это становится актуальным, если вы начинаете отправлять больше, чем пару байт.

+0

Большое спасибо, Марсель! – stas95

+0

Спасибо! Я пропустил часть заголовков, и это вызвало проблему. – satyadeepk

Смежные вопросы