宏
地址簇
- 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
套接字选项级别
函数
1. socket.socket([af, type, proto])
函数说明:创建套接字。
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])
函数说明:监听套接字,使服务器能够接收连接。
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.0'): #等待连接
time.sleep(1)
return True
#Catch exceptions,stop program if interrupted accidentally in the 'try'
try:
connectWifi(SSID,PASSWORD)
ip = wlan.ifconfig()[0] #获取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) #冻结网络
运行结果
客户端: