"); //-->
TCP是网络应用中常用的功能,很多高级功能的实现也是建立在TCP的基础上的,学会使用TCP后我们就可以在此基础上实现很多与网络相关的操作。
TCP Client模式是我们最常用的一种网络通讯模式,主要是用来访问服务器的,很多可以通过外网访问的物联网设备主要就是工作在TCP Client下。设备主动去访问外部的服务器,与服务器建立连接。下面我们来学习如何使用操作TCP。
客服端访问服务器流程:· 连接到Wi-Fi
· 选择服务器
· 实例化客户端
· 连接到服务器
· 向服务器请求数据
· 读取来自服务器的回复
相关函数介绍1.WiFiClient
创建一个客户端,该客户端可以连接到client.connect()中定义的指定的网络IP地址和端口。
WiFiClient client;
2.connected()
检查客户端是否已连接。请注意,如果连接已关闭但仍存在未读数据,则认为客户端已连接。
句法
client.connected()
if (!client.connected()) {
Serial.println();
Serial.println("disconnecting.");
client.stop();
for(;;)
参数:没有
返回值:如果客户端已连接,则返回true,否则返回false。
3.connect()
连接到构造函数中指定的IP地址和端口。返回值指示成功或失败。使用域名(ex:google.com)时,connect()还支持DNS查找。
句法:
client.connect(ip,端口)
client.connect(URL,端口)
参数
ip:客户端将连接的IP地址(4个字节的数组)
URL:客户端将连接到的域名(字符串,例如:“ arduino.cc”)
Port:客户端将连接到的端口(int)
返回值:如果连接成功,则返回true;否则,返回false。
4.write()
将数据写入客户端连接到的服务器。
句法
client.write(data)
参数
data:要写入的字节或字符
返回值:写入的字符数。无需读取此值。
5.print()
将数据打印到客户端连接到的服务器。将数字打印为数字序列,每个数字为一个ASCII字符(例如,数字123作为三个字符“ 1”,“ 2”,“ 3”发送)。
句法
client.print(data)
client.print(data,BASE)
参数
data:要打印的数据(char,byte,int,long或string)
BASE(可选):打印数字的基数:DEC代表十进制(基数10),OCT代表八进制(基数8),HEX代表十六进制(基数16)。
返回值:写入的字节数
6.println()
打印数据,后跟回车符和换行符,打印到客户端连接到的服务器。将数字打印为数字序列,每个数字为一个ASCII字符(例如,数字123作为三个字符“ 1”,“ 2”,“ 3”发送)。用法同print。
7.available()
描述
返回可用于读取的字节数(即,它所连接的服务器已将其写入客户端的数据量)。available()从Stream实用程序类继承。
句法
client.available()
参数:没有
返回值:可用字节数。
if (client.available())
{
char c = client.read();
Serial.print(c);
}
8.read()
读取从客户端连接到的服务器接收到的下一个字节(在对read()的最后一次调用之后)。read()从Stream实用程序类继承。
句法
client.read()
参数:没有
返回值:下一个字节(或字符);如果没有可用字节,则为-1。
9.flush()
丢弃已写入客户端但尚未读取的所有字节。flush()从Stream实用程序类继承。
句法
client.flush()
参数:没有
返回值:无
10.stop()
断开与服务器的连接
句法
client.stop()
参数:没有
返回值:无
了解完相关的函数和流程之后,我们来用实例练习一下,该实例的功能是每5秒访问一次百度,并将返回的数据从串口打印出来。
const char* ssid = "********";const char* password = "********"; const char* host = "www.example.com"; void setup(){ Serial.begin(115200); Serial.println(); Serial.printf("Connecting to %s ", ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(" connected"); } void loop(){ WiFiClient client; Serial.printf("\n[Connecting to %s ... ", host); if (client.connect(host, 80)) { Serial.println("connected]"); Serial.println("[Sending a request]"); client.print(String("GET /") + " HTTP/1.1\r\n" + "Host: " + host + "\r\n" + "Connection: close\r\n" + "\r\n" ); Serial.println("[Response:]"); while (client.connected() || client.available()) { if (client.available()) { String line = client.readStringUntil('\n'); Serial.println(line); } } client.stop(); Serial.println("\n[Disconnected]"); } else { Serial.println("connection failed!]"); client.stop(); } delay(5000); } 程序运行结果如下所示:
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。