NodeMcu_ESP8266开发板--TCP Server


  1. 创建TCP server
  1. WiFiServer server(IPAddress addr, uint16_t port); //创建TCP server
  2. //addr server的ip地址
  3. //port server的端口
  4. WiFiServer server(uint16_t port); //创建TCP server
  5. //port server的端口
  1. 启动TCP server
  1. void begin(); //启动TCP server
  2. void begin(uint16_t port); //启动TCP server
  3. //port server端口号
  1. 关闭延时发送功能
  1. void setNoDelay(bool nodelay); //是否禁用 Nagle 算法
  2. //nodelay true表示禁用 Nagle 算法

注意点:Nagle 算法的目的是通过合并一些小的发送消息,然后一次性发送所有的消息来减少通过网络发送的小数据包的tcp/ip流量。这种方法的缺点是延迟了单个消息的发送,直到一个足够大的包被组装

  1. 关闭TCP server
  1. void close(); //关闭TCP server
  1. 停止TCP server
  1. void stop(); //停止TCP server

注意点:stop()和 close()是同样的功能,所以调用哪一个都没有问题

  1. 返回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

  1. 获取有效的wificlient连接
  1. WiFiClient available(uint8_t* status = NULL); //获取有效的wificlient连接
  2. //返回值://如果存在有效的wificlient连接,就返回WiFiClient对象,如果没有那就返回一个无效的wificlient(connected等于false,开发者可以通过判断connected()
  1. 判断是否有client请求连接
    1. bool hasClient();//判断是否有client连接
    2. //返回值:bool 如果有client连接就返回true
    3. 注意点:开发者可以通过判断这个函数来判断是否有client连接,然后调用available() 方法来获取连接,这样拿到wificlient之后就可以调用wificlient的方法
  1. 允许最多多少个客户端
    WiFiClient serverClients[1]; //定义最多多少个client可以连接本server(一般不要超过4个)
  1. serverClients[i] 判断指定序号的客户端是否有效
    有效返回True
  1. serverClients[i].connected() 判断指定序号的客户端是否还连接着
    是 返回True 断开返回false

  2. serverClients[i].available() 判断指定客户端是否有可读数据

实例:

  1. //例子介绍:8266作为WiFiServer端,打开TCP调试助手,模拟TCP Client的请求
  2. #include <ESP8266WiFi.h>
  3. const char* ssid = "wifi666";
  4. const char* password = "12345678";
  5. #define MAX_SRV_CLIENTS 2 //做多多少个客户端可以连接
  6. WiFiServer server(23); //创建server 端口号是23
  7. WiFiClient serverClients[MAX_SRV_CLIENTS]; //定义最多多少个client可以连接本server(一般不要超过4个)
  8. void setup() {
  9. Serial.begin(9600);
  10. WiFi.mode(WIFI_STA);
  11. WiFi.begin(ssid, password);
  12. Serial.print("\n准备连接到:");
  13. Serial.println(ssid);
  14. uint8_t i = 0;
  15. while (WiFi.status() != WL_CONNECTED && i++ < 20) {
  16. delay(500);
  17. }
  18. if (i == 21) {
  19. Serial.print("没能连接到:");
  20. Serial.println(ssid);
  21. return ;
  22. }
  23. server.begin(); //启动server
  24. server.setNoDelay(true);//关闭小包合并包功能,不会延时发送数据
  25. Serial.print("准备好了!使用网络吧 IP是: ");
  26. Serial.print(WiFi.localIP());
  27. Serial.println(" 端口是: 23");
  28. }
  29. void loop() {
  30. uint8_t i;
  31. if (server.hasClient()) { //判断是否有新的client请求进来
  32. for (i = 0; i < MAX_SRV_CLIENTS; i++) {
  33. //释放旧无效或者断开的client
  34. if (!serverClients[i] || !serverClients[i].connected()) {
  35. if (!serverClients[i]) {
  36. //serverClients[i] 判断指定序号的客户端是否有效
  37. serverClients[i].stop(); //停止指定客户端的连接
  38. }
  39. serverClients[i] = server.available();//分配最新的client
  40. Serial.print("1个新的客户端: ");
  41. Serial.println(i);
  42. break; //跳出一层for循环
  43. }
  44. }
  45. //当达到最大连接数 无法释放无效的client,需要拒绝连接
  46. if (i == MAX_SRV_CLIENTS) {
  47. WiFiClient client = server.available();
  48. client.stop();
  49. Serial.println("连接被拒绝 ");
  50. }
  51. }
  52. //检测client发过来的数据
  53. for (i = 0; i < MAX_SRV_CLIENTS; i++) {
  54. if (serverClients[i] && serverClients[i].connected()) {
  55. if (serverClients[i].available()) {
  56. //serverClients[i].available() 判断指定客户端是否有可读数据
  57. while (serverClients[i].available()) {
  58. Serial.write(serverClients[i].read());
  59. }
  60. }
  61. }
  62. }
  63. if (Serial.available()) {
  64. //把串口调试器发过来的数据 发送给client
  65. size_t len = Serial.available(); //返回可读数据的长度
  66. uint8_t sbuf[len];
  67. Serial.readBytes(sbuf, len);
  68. //push UART data to all connected telnet clients
  69. for (i = 0; i < MAX_SRV_CLIENTS; i++) {
  70. if (serverClients[i] && serverClients[i].connected()) {
  71. serverClients[i].write(sbuf, len);//向客户端发送数据
  72. delay(1);
  73. }
  74. }
  75. }
  76. }

原文连接:https://www.cnblogs.com/liming19680104/p/11237199.html


local 2021年10月25日 20:02 收藏文档