KIKI 发表于 2020-6-18 14:10:37

ESP32 常用的模块 socket 3.1.19


## 宏
#### 地址簇

* socket.AF_INET =2 — TCP/IP – IPv4
* socket.AF_INET6 =10 — TCP/IP – IPv6

#### 套接字类型
* socket.SOCK_STREAM =1 — TCP流
* socket.SOCK_DGRAM =2 — UDP数据报
* socket.SOCK_RAW =3 — 原始套接字
* socket.SO_REUSEADDR =4 — socket可重用


#### IP协议号
* socket.IPPROTO_TCP =16
* socket.IPPROTO_UDP =17

#### 套接字选项级别
* socket.SOL_SOCKET =4095


## 函数
#### 1. socket.socket()
函数说明:创建套接字。
```
af:地址
type:类型
proto:协议号
```
注意:一般不指定proto,因为有些microPython固件会忽略这一选项。
示例:
```
>>> s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
>>> print(s)
<socket>
```
#### 1.1. socket.socket.setsockopt(level, optname, value)
函数说明:根据选项值设置套接字。
```
level:套接字选项级别
optname:套接字的选项
value:可以是一个整数,也可以是一个表示缓冲区的bytes类对象。
```
示例:
```

s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
```
#### 1.2. socket.socket.bind(address)
函数说明:以列表或元组的方式绑定地址和端口号。
```
address:一个包含地址和端口号的列表或元组。
```

示例:

```
addr = ("127.0.0.1",10000)
s.bind(addr)
```
#### 1.3. socket.socket.listen()
函数说明:监听套接字,使服务器能够接收连接。
backlog:接受套接字的最大个数,至少为0,如果没有指定,则默认一个合理值。
#### 1.4. socket.socket.accept()
函数说明:接收连接请求。
注意:只能在绑定地址端口号和监听后调用,返回conn和address。
```
conn:新的套接字对象,可以用来收发消息
address:连接到服务器的客户端地址
```
示例:
```

conn,addr = s.accept()
```
#### 1.5. socket.socket.connect(adress)
函数说明:连接服务器。
```

address:服务器地址和端口号的元组或列表
```
示例:
```

host = "192.168.3.147"
port = 100
s.connect((host, port))
```
#### 1.6. socket.socket.send(bytes)
函数说明:发送数据,并返回发送的字节数。
```

bytes:bytes类型数据
```
示例:
```

s.send("hello DFRobot, I am TCP Client")
```
#### 1.7. socket.socket.sendall(bytes)
函数说明:与send()函数类似,区别是sendall()函数通过数据块连续发送数据。
```

bytes:bytes类型数据
```
示例:
```

s.sendall("hello DFRobot, I am TCP Client")
```
#### 1.8. socket.socket.sendto(bytes, address)
函数说明:发送数据,目标由address决定,用于UDP通信,返回发送的数据大小。
```
bytes:bytes类型数据
address:目标地址和端口号的元组
```
示例:
```

data = sendto("hello DFRobot", ("192.168.3.147", 100))
```
#### 1.9. socket.socket.recv(bufsize)
函数说明:接收数据,返回接收到的数据对象。
```

bufsize:指定一次接收的最大数据量
```
示例:
```

data = conn.recv(1024)
```
#### 1.10. socket.socket.recvfrom(bufsize)
函数说明:接收数据,用于UDP通信,并返回接收到的数据对象和对象的地址。
```

bufsize:指定一次接收的最大数据量
```
示例:
```

data,addr=fd.recvfrom(1024)
```
#### 1.11. socket.socket.settimeout(value)
函数说明:设置超时时间,单位:秒。
示例:
```
s.settimeout(2)
```
#### 1.12. socket.socket.readline()
函数说明:接收一行数据,遇换行符结束,并返回接收数据的对象 。
#### 1.13. socket.socket.write(buf)
函数说明:将字节类型数据写入套接字,并返回写入数据的大小。
#### 1.14. socket.socket.close()
函数说明:关闭套接字。
示例:
```
s.close()
```
#### 2. socket.getaddrinfo(host, port)
函数说明:将主机域名(host)和端口(port)转换为用于创建套接字的5元组序列。元组列表的结构如下:
```
(family, type, proto, canonname, sockaddr)
```
示例:

```
>>> info = socket.getaddrinfo("127.0.0.1", 10000)
>>> print(info)
[(2, 1, 0, '127.0.0.1', ('127.0.0.1', 10000))]
综合示例
   保存下面的代码为.py文件,要运行这个代码,你要确保连接了WiFi。
import network
import socket
import time

SSID = "dfrobotYanfa"#修改为你的WiFi名称
PASSWORD = "hidfrobot"#修改为你WiFi密码
port = 10000#端口号
wlan = None#wlan
listenSocket = None#套接字

#连接WiFi
def connectWifi(ssid,passwd):   
global wlan
wlan = network.WLAN(network.STA_IF)
wlan.active(True)   #激活网络
wlan.disconnect()   #断开WiFi连接
wlan.connect(ssid, passwd)   #连接WiFi
while(wlan.ifconfig() == '0.0.0.0'):   #等待连接
    time.sleep(1)
return True

#Catch exceptions,stop program if interrupted accidentally in the 'try'
try:
connectWifi(SSID,PASSWORD)
ip = wlan.ifconfig()   #获取IP地址
listenSocket = socket.socket()   #创建套接字
listenSocket.bind((ip, port))   #绑定地址和端口号
listenSocket.listen(1)   #监听套接字
listenSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)   #设置套接字
print ('tcp waiting...')

while True:
    print("accepting.....")
    conn, addr = listenSocket.accept()   #接收连接请求,返回收发数据的套接字对象和客户端地址
    print(addr, "connected")

    while True:
      data = conn.recv(1024)   #接收数据(1024字节大小)
      if(len(data) == 0):   #判断客户端是否断开连接
      print("close socket")
      conn.close()   #关闭套接字
      break
      print(data)
      ret = conn.send(data)   #发送数据
except:
if(listenSocket):   #判断套接字是否为空
    listenSocket.close()   #关闭套接字
wlan.disconnect()   #断开WiFi
wlan.active(False)   #冻结网络
```
## 运行结果

### 客户端:

页: [1]
查看完整版本: ESP32 常用的模块 socket 3.1.19