所謂server,可以簡單理解為提供服務,提供數據的一個地方
ESP8266上建立一個server是比較簡單的,不過是屬於局域網內的server,因為真正意義上的server並不是這樣的,大伙了解一個這樣的概念就好
1.創建TCP server
WiFiServer server(IPAddress addr, uint16_t port); //創建TCP server //addr server的ip地址 //port server的端口 WiFiServer server(uint16_t port); //創建TCP server //port server的端口
2.啟動TCP server
void begin(); //啟動TCP server void begin(uint16_t port); //啟動TCP server //port server端口號
3. 關閉延時發送功能
void setNoDelay(bool nodelay); //是否禁用 Nagle 算法 //nodelay true表示禁用 Nagle 算法
注意點:Nagle 算法的目的是通過合並一些小的發送消息,然后一次性發送所有的消息來減少通過網絡發送的小數據包的tcp/ip流量。這種方法的缺點是延遲了單個消息的發送,直到一個足夠大的包被組裝
4.關閉TCP server
void close(); //關閉TCP server
5.停止TCP server
void stop(); //停止TCP server
注意點:stop()和 close()是同樣的功能,所以調用哪一個都沒有問題
6.返回TCP server狀態
uint8_t status(); //返回TCP server狀態 //返回值:wl_tcp_state tcp狀態
wl_tcp_state 包括:
CLOSED = 0,// 關閉
LISTEN = 1,// 監聽中
SYN_SENT = 2,
SYN_RCVD = 3,
ESTABLISHED = 4,// 建立連接
FIN_WAIT_1 = 5,
FIN_WAIT_2 = 6,
CLOSE_WAIT = 7,
CLOSING = 8,
LAST_ACK = 9,
TIME_WAIT = 10
7.獲取有效的wificlient連接
WiFiClient available(uint8_t* status = NULL); //獲取有效的wificlient連接 //返回值://如果存在有效的wificlient連接,就返回WiFiClient對象,如果沒有那就返回一個無效的wificlient(connected等於false,開發者可以通過判斷connected()
8.判斷是否有client請求連接
bool hasClient();//判斷是否有client連接 //返回值:bool 如果有client連接就返回true
注意點:開發者可以通過判斷這個函數來判斷是否有client連接,然后調用available() 方法來獲取連接,這樣拿到wificlient之后就可以調用wificlient的方法
9.允許最多多少個客戶端
WiFiClient serverClients[1]; //定義最多多少個client可以連接本server(一般不要超過4個)
10.
serverClients[i] 判斷指定序號的客戶端是否有效
有效返回True
11.
serverClients[i].connected() 判斷指定序號的客戶端是否還連接着
是 返回True 斷開返回false
12.
serverClients[i].available() 判斷指定客戶端是否有可讀數據
實例:
//例子介紹:8266作為WiFiServer端,打開TCP調試助手,模擬TCP Client的請求 #include <ESP8266WiFi.h> const char* ssid = "jia"; const char* password = "lm654321"; #define MAX_SRV_CLIENTS 2 //做多多少個客戶端可以連接 WiFiServer server(23); //創建server 端口號是23 WiFiClient serverClients[MAX_SRV_CLIENTS]; //定義最多多少個client可以連接本server(一般不要超過4個) void setup() { Serial.begin(115200); WiFi.mode(WIFI_STA); WiFi.begin(ssid, password); Serial.print("\n連接到:"); Serial.println(ssid); uint8_t i = 0; while (WiFi.status() != WL_CONNECTED && i++ < 20) { delay(500); } if (i == 21) { Serial.print("沒能連接到:"); Serial.println(ssid); return ; } server.begin(); //啟動server server.setNoDelay(true);//關閉小包合並包功能,不會延時發送數據 Serial.print("准備好了!使用網絡吧 IP是: "); Serial.print(WiFi.localIP()); Serial.println(" 端口是: 23"); } void loop() { uint8_t i; if (server.hasClient()) { //判斷是否有新的client請求進來 for (i = 0; i < MAX_SRV_CLIENTS; i++) { //釋放舊無效或者斷開的client if (!serverClients[i] || !serverClients[i].connected()) { if (!serverClients[i]) { //serverClients[i] 判斷指定序號的客戶端是否有效 serverClients[i].stop(); //停止指定客戶端的連接 } serverClients[i] = server.available();//分配最新的client Serial.print("1個新的客戶端: "); Serial.println(i); break; //跳出一層for循環 } } //當達到最大連接數 無法釋放無效的client,需要拒絕連接 if (i == MAX_SRV_CLIENTS) { WiFiClient client = server.available(); client.stop(); Serial.println("連接被拒絕 "); } } //檢測client發過來的數據 for (i = 0; i < MAX_SRV_CLIENTS; i++) { if (serverClients[i] && serverClients[i].connected()) { if (serverClients[i].available()) { //serverClients[i].available() 判斷指定客戶端是否有可讀數據 while (serverClients[i].available()) { Serial.write(serverClients[i].read()); } } } } if (Serial.available()) { //把串口調試器發過來的數據 發送給client size_t len = Serial.available(); //返回可讀數據的長度 uint8_t sbuf[len]; Serial.readBytes(sbuf, len); //push UART data to all connected telnet clients for (i = 0; i < MAX_SRV_CLIENTS; i++) { if (serverClients[i] && serverClients[i].connected()) { serverClients[i].write(sbuf, len);//向客戶端發送數據 delay(1); } } } }
天子驕龍