所谓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();
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
Serial.print("\n连接到:");
Serial.println(ssid);
uint8_t i = ;
while (WiFi.status() != WL_CONNECTED && i++ < ) {
delay();
}
if (i == ) {
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 = ; 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 = ; 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 = ; i < MAX_SRV_CLIENTS; i++) {
if (serverClients[i] && serverClients[i].connected()) {
serverClients[i].write(sbuf, len);//向客户端发送数据
delay();
}
}
}
}

天子骄龙

ESP8266--TCP Server的更多相关文章

  1. ESP8266开发之旅 网络篇⑦ TCP Server & TCP Client

    授人以鱼不如授人以渔,目的不是为了教会你具体项目开发,而是学会学习的能力.希望大家分享给你周边需要的朋友或者同学,说不定大神成长之路有博哥的奠基石... QQ技术互动交流群:ESP8266&3 ...

  2. socket - socketserver - start TCP server

    前面提到如何使用socket模块启动tcpserver: 创建socket:sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 绑定ip: ...

  3. [转] 3个学习Socket编程的简单例子:TCP Server/Client, Select

    以前都是采用ACE的编写网络应用,最近由于工作需要,需要直接只用socket接口编写CS的代码,重新学习这方面的知识,给出自己所用到的3个简单例子,都是拷贝别人的程序.如果你能完全理解这3个例子,估计 ...

  4. [转]一个基于完成端口的TCP Server Framework,浅析IOCP

    [转]一个基于完成端口的TCP Server Framework,浅析IOCP http://www.cppblog.com/adapterofcoms/archive/2010/06/26/1187 ...

  5. 【转载】C# Tutorial - Simple Threaded TCP Server

    http://tech.pro/tutorial/704/csharp-tutorial-simple-threaded-tcp-server In this tutorial I'm going t ...

  6. Socket TCP Server一个端口可以有多少个长连接?受到什么影响?linux最大文件句柄数量总结

    Socket TCP Server一个端口可以有多少个长连接? 网上答案很多,不知道那个才是正确的 理论上是无限的 16.Linux中,一个端口能够接受tcp链接数量的理论上限是? A.1024 B. ...

  7. 基于 LWIP 建立 TCP Server 与主机通信实验

    LWIP 版本:2.0.3 上一篇文章是写如何将 LWIP 移植到板子上,今天晚上记录基于 LWIP 实现与主机的网络通信. 先是打开了原子的实验例程,大概浏览了一遍,觉得 TCP 网络网络通信也就是 ...

  8. swoole深入学习 2. tcp Server和tcp Client

    这节来学习Swoole最基础的Server和Client.会通过创建一个tcp Server来讲解. server <?php class Server { private $serv; pub ...

  9. Modbus库开发笔记之九:利用协议栈开发Modbus TCP Server应用

    前面我们已经完成了Modbus协议栈的开发,但这不是我们的目的.我们开发它的目的当然是要使用它来解决我们的实际问题.接下来我们就使用刚开发的Modbus协议栈开发一个Modbus TCP Server ...

  10. Modbus库开发笔记之三:Modbus TCP Server开发

    在完成了前面的工作后,我们就可以实现有针对性的应用了,首先我们来实现Modbus TCP的服务器端应用.当然我们不是做具体的应用,而是对Modbus TCP的服务器端应用进行封装以供有需要时调用. 这 ...

随机推荐

  1. Dojo入门:初识Dojo

      Dojo的全称是Dojo Toolkit,始创于2004年,是当前各种蓬勃发展的JS工具包中的佼佼者.Dojo 为富互联网应用程序(RIA) 的开发提供了完整的端到端的解决方案,包括核心的 Jav ...

  2. WinForm和WPF中注册热键

    由于.Net没有提供专门的类库处理热键,所以需要直接调用windows API来解决. HotKey为.NET调用Windows API的封装代码,主要是RegisterHotKey和Unregist ...

  3. python3 selenuim PC端使用chrome模拟手机进行H5自动化

    情况说明:初次在做PC端使用chrome进行H5自动化测试时,以为和app端自动化一样使用click()就可以对按钮进行点击,找了好几天也没有找到解决方法,有些人说是工程问题,有些人是使用微信进行H5 ...

  4. js 数组去重方法总结

    var arr = [1, 1, 'true', 'true', true, true, 15, 15, false, false, undefined, undefined, null, null, ...

  5. Nginx配置反向代理与负载均衡

    Nginx的upstream目前支持的分配算法: 1.round-robin 轮询1:1轮流处理请求(默认) 每个请求按时间顺序逐一分配到不同的应用服务器,如果应用服务器down掉,自动剔除,剩下的继 ...

  6. 【CUDA】CUDA框架介绍

    引用 出自Bookc的博客,链接在此http://bookc.github.io/2014/05/08/my-summery-the-book-cuda-by-example-an-introduct ...

  7. flask config笔记

    #从flask这个包中导入Flask这个类 #Flask这个类是项目的核心,以后很多操作都是基于这个类的对象 #注册url.注册蓝图等都是基于这个类的对象 from flask import Flas ...

  8. 六、Kubernetes_V1.10集群部署-node-部署节点组件

    一.配置kubelet 1.配置启动文件 # cat > /usr/lib/systemd/system/kubelet.service <<EOF [Unit] Descripti ...

  9. 查看主机CPU信息

    一.关于CPU的几个概念 CPU的作用 计算机中的中央处理单元(CPU)执行基本的计算工作 -- 运行程序.但是,一个单核的CPU同一时间只能一次执行一个任务,为了提高计算机的处理能力,也就出现了多C ...

  10. 交换机安全学习笔记 第四章 VLAN

      Trunk 口  思科称为:native VLAN  华为称为:PVID   说白了就是Trunk端口本身所属的VLAN,因为,Trunk端口要"透传"多个VLAN的流量,其本 ...