22 Chat Server
33
44 A simple server that distributes any incoming messages to all
5- connected clients. To use telnet to your device's IP address and type.
5+ connected clients but the client the message comes from.
6+ To use telnet to your device's IP address and type.
67 You can see the client's input in the serial monitor as well.
78 Using an Arduino Wiznet Ethernet shield.
89
1415 by David A. Mellis
1516 modified 9 Apr 2012
1617 by Tom Igoe
18+ redesigned to make use of operator== 25 Nov 2013
19+ by Norbert Truchsess
1720
1821 */
1922
2528// gateway and subnet are optional:
2629byte mac[] = {
2730 0xDE , 0xAD , 0xBE , 0xEF , 0xFE , 0xED };
28- IPAddress ip (192 ,168 ,1 , 177 );
29- IPAddress gateway (192 ,168 ,1 , 1 );
30- IPAddress subnet (255 , 255 , 0 , 0 );
31+ IPAddress ip (192 ,168 ,0 , 6 );
32+ IPAddress gateway (192 ,168 ,0 , 1 );
33+ IPAddress subnet (255 , 255 , 255 , 0 );
3134
3235
3336// telnet defaults to port 23
3437EthernetServer server (23 );
35- boolean alreadyConnected = false ; // whether or not the client was connected previously
38+
39+ EthernetClient clients[4 ];
3640
3741void setup () {
3842 // initialize the ethernet device
@@ -54,26 +58,55 @@ void loop() {
5458 // wait for a new client:
5559 EthernetClient client = server.available ();
5660
57- // when the client sends the first byte, say hello:
5861 if (client) {
59- if (!alreadyConnected) {
62+
63+ boolean newClient = true ;
64+ for (byte i=0 ;i<4 ;i++) {
65+ if (clients[i]==client) {
66+ newClient = false ;
67+ break ;
68+ }
69+ }
70+
71+ if (newClient) {
72+ for (byte i=0 ;i<4 ;i++) {
73+ if (clients[i]!=client) {
74+ clients[i] = client;
75+ Serial.print (" found slot: " );
76+ Serial.println (i);
77+ break ;
78+ }
79+ }
80+
6081 // clead out the input buffer:
6182 client.flush ();
6283 Serial.println (" We have a new client" );
6384 client.println (" Hello, client!" );
64- alreadyConnected = true ;
65- }
85+ client.print (" your IP: " );
86+ client.println (client.remoteIP ());
87+ client.print (" your port: " );
88+ client.println (client.remotePort ());
89+ }
6690
6791 if (client.available () > 0 ) {
6892 // read the bytes incoming from the client:
6993 char thisChar = client.read ();
7094 // echo the bytes back to the client:
71- server.write (thisChar);
95+ for (byte i=0 ;i<4 ;i++) {
96+ if (!clients[i] || (clients[i]==client)) {
97+ continue ;
98+ }
99+ clients[i].write (thisChar);
100+ }
72101 // echo the bytes to the server as well:
73102 Serial.write (thisChar);
74103 }
75104 }
105+ for (byte i=0 ;i<4 ;i++) {
106+ if (!(clients[i].connected ())) {
107+ clients[i].stop ();
108+ ~clients[i];
109+ clients[i]=EthernetClient ();
110+ }
111+ }
76112}
77-
78-
79-
0 commit comments