ESP8266--TCP Server


所謂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);
      }
    }
  }
}

 

 

 

天子驕龍

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM