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();
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();
}
}
}
}
天子骄龙
最新文章
- FragmentPagerAdapter加载fragment并使用setUserVisibleHint()处理预加载时遇到的坑,给textview赋值时出现的空指针异常
- OD20
- 使用php来访问操作sql server
- Android获取系统时间方法的总结
- bzoj1855: [Scoi2010]股票交易--单调队列优化DP
- 在阿里云主机的Debian操作系统上安装Docker
- codeforces 486B.OR in Matrix 解题报告
- PackageManager获取版本号
- 学渣也要搞 laravel(2)—— HTTP路由[1]篇
- JAVA WEBSERVICE服务端&;客户端的配置及调用(基于JDK)
- PE知识复习之PE的导入表
- SQLServer之创建DML AFTER UPDATE触发器
- app自动化测试之实战应用(百度app简单测试)
- C. Good Array
- Hard Rock
- eclipse去掉所有断点 恢复到默认窗口
- v891 安卓平板的root
- BZOJ 5194--[Usaco2018 Feb]Snow Boots(STL)
- python就业班-淘宝-目录.txt
- 调用css文件,进行调色
热门文章
- Google Home Mini配置失败解决办法
- 【MM系列】SAP SAP库龄报表逻辑理解
- LeetCode.1025-除数游戏(Divisor Game)
- 【神经网络与深度学习】在Windows8.1上用VS2013编译Caffe并训练和分类自己的图片
- dos2unix Linux解决编写脚本出现“%0D
- 记一则update 发生enq: TX - row lock contention 的处理方法
- 查看主机CPU信息
- [转帖]56核Xeon Platinum 9200现身 - 英特尔有史以来最大的CPU封装
- Redis 3主-3从集群的搭建(CentOS 7)
- linux DTS介绍