Ethernet Shield AdvancedChat Server
Set up a simple chat server.
A more sophisticated server that distributes any incoming messages to all connected clients except the one that is sending the message. To use, open a terminal window, Telnet to your devices IP address, and type away. Any incoming text will be sent to all connected clients (including the one typing). Additionally, you will be able to see the client's input in your serial monitor as well.
Hardware Required
Arduino Board
Circuit
The Ethernet shield allows you to connect a WizNet Ethernet controller to the Arduino boards via the SPI bus. It uses pins 10, 11, 12, and 13 for the SPI connection to the WizNet. Later models of the Ethernet shield also have an SD Card on board. Digital pin 4 is used to control the chip select pin on the SD card.
The shield should be connected to a network with an ethernet cable. You will need to change the network settings in the program to correspond to your network.
image developed using Fritzing. For more circuit examples, see the Fritzing project page
In the above image, the Arduino board would be stacked below the Ethernet shield.
Schematic
Code:
1/*2
3 Advanced Chat Server4
5 A more advanced server that distributes any incoming messages6
7 to all connected clients but the client the message comes from.8
9 To use, telnet to your device's IP address and type.10
11 You can see the client's input in the serial monitor as well.12
13 Using an Arduino Wiznet Ethernet shield.14
15 Circuit:16
17 * Ethernet shield attached to pins 10, 11, 12, 1318
19 created 18 Dec 200920
21 by David A. Mellis22
23 modified 9 Apr 201224
25 by Tom Igoe26
27 redesigned to make use of operator== 25 Nov 201328
29 by Norbert Truchsess30
31 */32
33#include <SPI.h>34#include <Ethernet.h>35
36// Enter a MAC address and IP address for your controller below.37// The IP address will be dependent on your local network.38// gateway and subnet are optional:39byte mac[] = {40
41 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED42};43
44IPAddress ip(192, 168, 1, 177);45
46IPAddress myDns(192, 168, 1, 1);47
48IPAddress gateway(192, 168, 1, 1);49
50IPAddress subnet(255, 255, 0, 0);51
52// telnet defaults to port 2353
54EthernetServer server(23);55
56EthernetClient clients[8];57
58void setup() {59
60 // You can use Ethernet.init(pin) to configure the CS pin61
62 //Ethernet.init(10); // Most Arduino shields63
64 //Ethernet.init(5); // MKR ETH shield65
66 //Ethernet.init(0); // Teensy 2.067
68 //Ethernet.init(20); // Teensy++ 2.069
70 //Ethernet.init(15); // ESP8266 with Adafruit Featherwing Ethernet71
72 //Ethernet.init(33); // ESP32 with Adafruit Featherwing Ethernet73
74 // initialize the Ethernet device75
76 Ethernet.begin(mac, ip, myDns, gateway, subnet);77
78 // Open serial communications and wait for port to open:79
80 Serial.begin(9600);81
82 while (!Serial) {83
84 ; // wait for serial port to connect. Needed for native USB port only85
86 }87
88 // Check for Ethernet hardware present89
90 if (Ethernet.hardwareStatus() == EthernetNoHardware) {91
92 Serial.println("Ethernet shield was not found. Sorry, can't run without hardware. :(");93
94 while (true) {95
96 delay(1); // do nothing, no point running without Ethernet hardware97
98 }99
100 }101
102 if (Ethernet.linkStatus() == LinkOFF) {103
104 Serial.println("Ethernet cable is not connected.");105
106 }107
108 // start listening for clients109
110 server.begin();111
112 Serial.print("Chat server address:");113
114 Serial.println(Ethernet.localIP());115}116
117void loop() {118
119 // check for any new client connecting, and say hello (before any incoming data)120
121 EthernetClient newClient = server.accept();122
123 if (newClient) {124
125 for (byte i=0; i < 8; i++) {126
127 if (!clients[i]) {128
129 Serial.print("We have a new client #");130
131 Serial.println(i);132
133 newClient.print("Hello, client number: ");134
135 newClient.println(i);136
137 // Once we "accept", the client is no longer tracked by EthernetServer138
139 // so we must store it into our list of clients140
141 clients[i] = newClient;142
143 break;144
145 }146
147 }148
149 }150
151 // check for incoming data from all clients152
153 for (byte i=0; i < 8; i++) {154
155 if (clients[i] && clients[i].available() > 0) {156
157 // read bytes from a client158
159 byte buffer[80];160
161 int count = clients[i].read(buffer, 80);162
163 // write the bytes to all other connected clients164
165 for (byte j=0; j < 8; j++) {166
167 if (j != i && clients[j].connected()) {168
169 clients[j].write(buffer, count);170
171 }172
173 }174
175 }176
177 }178
179 // stop any clients which disconnect180
181 for (byte i=0; i < 8; i++) {182
183 if (clients[i] && !clients[i].connected()) {184
185 Serial.print("disconnect client #");186
187 Serial.println(i);188
189 clients[i].stop();190
191 }192
193 }194}
Last revision 2018/08/23 by SM
Suggest changes
The content on docs.arduino.cc is facilitated through a public GitHub repository. If you see anything wrong, you can edit this page here.
License
The Arduino documentation is licensed under the Creative Commons Attribution-Share Alike 4.0 license.