Is it possible to have more than one client on a server chat if so, how?

Hello everyone,

In the server chat example code for the WiFi shield, the description shows how a client can communicate with a chat server the shield creates on Telnet. However, when I added a second client on to this server the second client was not able to connect. I used the following code from the example and modified it slightly to have two clients.

#include <SPI.h>
#include <WiFi.h>

char ssid[] = "myqwest2629"; //  your network SSID (name) sa
char pass[] = "****************";    // your network password (use for WPA, or use as key for WEP)

int keyIndex = 0;            // your network key Index number (needed only for WEP)

int status = WL_IDLE_STATUS;

WiFiServer server(23);

boolean alreadyConnected = false; // whether or not the client was connected previously

void setup() {
  //Initialize serial and wait for port to open:
  Serial.begin(9600); 
  while (!Serial) {
    ; // wait for serial port to connect. Needed for Leonardo only
  }
  
  // check for the presence of the shield:
  if (WiFi.status() == WL_NO_SHIELD) {
    Serial.println("WiFi shield not present"); 
    // don't continue:
    while(true);
  }  
  
  // attempt to connect to Wifi network:
  while (status != WL_CONNECTED) { 
    Serial.print("Attempting to connect to SSID: ");
    Serial.println(ssid);
    // Connect to WPA/WPA2 network. Change this line if using open or WEP network:   
    status = WiFi.begin(ssid, pass);

    // wait 10 seconds for connection:
    delay(10000);
  } 
  // start the server:
  server.begin();
  // you're connected now, so print out the status:
  printWifiStatus();
 }


void loop() {
  // first client:
  WiFiClient client = server.available();
  
  //second client:
  WiFiClient client_2 = server.available();


  // when the client sends the first byte, say hello:
  if (client) {
    if (!alreadyConnected) {
      // clead out the input buffer:
      client.flush();    
      Serial.println("We have a new client");
      client.println("Hello, client!"); 
      alreadyConnected = true;
    } 

    if (client.available() > 0) {
      // read the bytes incoming from the client:
      char thisChar = client.read();
      // echo the bytes back to the client:
      server.write(thisChar);
      // echo the bytes to the server as well:
      Serial.write(thisChar);
    }
  }
  
  // Second client
  if (client_2) {
    if (!alreadyConnected) {
      // clead out the input buffer:
      client_2.flush();    
      Serial.println("We have a new client");
      client_2.println("Hello, client!"); 
      alreadyConnected = true;
    } 

    if (client_2.available() > 0) {
      // read the bytes incoming from the client:
      char thisChar_1 = client_2.read();
      // echo the bytes back to the client:
      server.write(thisChar_1);
      // echo the bytes to the server as well:
      Serial.write(thisChar_1);
    }
  }
}


void printWifiStatus() {
  // print the SSID of the network you're attached to:
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());

  // print your WiFi shield's IP address:
  IPAddress ip = WiFi.localIP();
  Serial.print("IP Address: ");
  Serial.println(ip);

  // print the received signal strength:
  long rssi = WiFi.RSSI();
  Serial.print("signal strength (RSSI):");
  Serial.print(rssi);
  Serial.println(" dBm");
}

I’m not sure if this code is written incorrectly or that this is physically not possible. Any suggestions will greatly help.

Thank You!!!

The standard chat server example should be able to support more than one client (up to 4), although I never tested it. Your code doesn't make sense as the second client (client_2) will only be active in the rare event that both clients connect at exactly the same time.

If the device was an ethernet shield, you can have more than one client connected and communicating, but not using the standard ethernet library. You must use the socket.h and w5100.h utilities. Otherwise more than one client can connect, but only one can communicate at a time.

The wifi shield has its own problems. The server section of the firmware (not the library) has a bug that prevents it from using more than one socket, so even if you try it, the clients would be corrupting each other's communication. :(

Hmm... if that's true how can I modify my code to arrange for multiple clients on a server maintained by the WiFi shield. Any suggestions on adapting my code or changing any other parameters to do so?

Thank you for your response!

chadha: Hmm... if that's true how can I modify my code to arrange for multiple clients on a server maintained by the WiFi shield. Any suggestions on adapting my code or changing any other parameters to do so?

Thank you for your response!

AFAIK, you can't. It doesn't have the same low level code available for it that the ethernet shield has in the socket.h and w5100.h files.

Hi, Some of you mentioned it is possible to use multiple clients when using Ethernet. This is exactly what I am looking for my project. Can someone please elaborate more on implementing this feature? Let us assume having - EthernetClient client1, client2; How can the two be linked to different ports and create two different connections to servers? Thanks.

Let us assume having - EthernetClient client1, client2; How can the two be linked to different ports and create two different connections to servers?

By using the connect() method on both objects with different server names/ips and different ports.

Maybe it helps: http://subethasoftware.com/2013/04/08/arduino-ethernet-and-multiple-socket-server-connections/