Your new topic does not fit any of the above??? Check first. Then post here. Thanks.

Moderator: igrr

User avatar
By craigfoo
#48120 I'm messing around with the WiFiWebServer example from the ESP8266 Arduino GitHub:

Code: Select all/*
 *  This sketch demonstrates how to set up a simple HTTP-like server.
 *  The server will set a GPIO pin depending on the request
 *    http://server_ip/gpio/0 will set the GPIO2 low,
 *    http://server_ip/gpio/1 will set the GPIO2 high
 *  server_ip is the IP address of the ESP8266 module, will be
 *  printed to Serial when the module is connected.
 */

#include <ESP8266WiFi.h>

const char* ssid = "your-ssid";
const char* password = "your-password";

// Create an instance of the server
// specify the port to listen on as an argument
WiFiServer server(80);

void setup() {
  Serial.begin(115200);
  delay(10);

  // prepare GPIO2
  pinMode(2, OUTPUT);
  digitalWrite(2, 0);
 
  // Connect to WiFi network
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
 
  WiFi.begin(ssid, password);
 
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
 
  // Start the server
  server.begin();
  Serial.println("Server started");

  // Print the IP address
  Serial.println(WiFi.localIP());
}

void loop() {
  // Check if a client has connected
  WiFiClient client = server.available();
  if (!client) {
    return;
  }
 
  // Wait until the client sends some data
  Serial.println("new client");
  while(!client.available()){
    delay(1);
  }
 
  // Read the first line of the request
  String req = client.readStringUntil('\r');
  Serial.println(req);
  client.flush();
 
  // Match the request
  int val;
  if (req.indexOf("/gpio/0") != -1)
    val = 0;
  else if (req.indexOf("/gpio/1") != -1)
    val = 1;
  else {
    Serial.println("invalid request");
    client.stop();
    return;
  }

  // Set GPIO2 according to the request
  digitalWrite(2, val);
 
  client.flush();

  // Prepare the response
  String s = "HTTP/1.1 200 OK\r\nContent-Type: text/html\r\n\r\n<!DOCTYPE HTML>\r\n<html>\r\nGPIO is now ";
  s += (val)?"high":"low";
  s += "</html>\n";

  // Send the response to the client
  client.print(s);
  delay(1);
  Serial.println("Client disonnected");

  // The client will actually be disconnected
  // when the function returns and 'client' object is detroyed
}


How can I prevent this from disconnecting the client every time I send a packet over so the client doesn't have to reconnect every time? I just want to keep the connection alive so the server and client can talk back and forth until I terminate the connection.
User avatar
By martinayotte
#48123 Your question is not clear !
The HTTP protocol by itself is based on client/server connections which are disconnecting by the browser (or by the server in some case) after the negotiations are finished.
If you wish to have permanent connections, they won't be HTTP (except in rare case such HTTP streaming), but either WebSocket or plain TCP such Telnet.
User avatar
By craigfoo
#48124 You're right, that makes sense.

The scenario I'm trying to work is when a client connects and sends data, I want to read that data, go off and do a bunch of things and then send a message back to the client. What happens if going off and doing a bunch of things takes time and the connection is lost? Should the client keep checking in?
User avatar
By martinayotte
#48127 Well, there are several ways to achieve that.

Of course, this also depends what is the client, is it a browser or another MCU or a PC server ?
Personally, I would go with plain TCP connections.

You can still look at "HTTP persistent connection", but there are several disadvantages, especially if you have several clients simultaneously. You can tell in your first response header to the browser to keep connection alive.
Here are some readings :
https://en.wikipedia.org/wiki/HTTP_pers ... connection