class usocket - socket模块
该模块提供对BSD套接字接口的访问。该模块实现相应CPython模块的子集。更多信息请参阅阅CPython文档:socket
示例:
# 导入usocket模块
# -*- coding: UTF-8 -*-
import usocket
import log
import utime
import checkNet
'''
下面两个全局变量是必须有的,用户可以根据自己的实际项目修改下面两个全局变量的值
'''
PROJECT_NAME = "QuecPython_Socket_example"
PROJECT_VERSION = "1.0.0"
checknet = checkNet.CheckNetwork(PROJECT_NAME, PROJECT_VERSION)
# 设置日志输出级别
log.basicConfig(level=log.INFO)
socket_log = log.getLogger("SOCKET")
if __name__ == '__main__':
stagecode, subcode = checknet.wait_network_connected(30)
if stagecode == 3 and subcode == 1:
socket_log.info('Network connection successful!')
# 创建一个socket实例
sock = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM)
# 解析域名
sockaddr=usocket.getaddrinfo('www.tongxinmao.com', 80)[0][-1]
# 建立连接
sock.connect(sockaddr)
# 向服务端发送消息
ret=sock.send('GET /News HTTP/1.1\r\nHost: www.tongxinmao.com\r\nAccept-Encoding: deflate\r\nConnection: keep-alive\r\n\r\n')
socket_log.info('send %d bytes' % ret)
#接收服务端消息
data=sock.recv(256)
socket_log.info('recv %s bytes:' % len(data))
socket_log.info(data.decode())
# 关闭连接
sock.close()
else:
socket_log.info('Network connection failed! stagecode = {}, subcode = {}'.format(stagecode, subcode))
构造函数
usocket.socket
class usocket.socket(af=AF_INET, type=SOCK_STREAM, proto=IPPROTO_TCP)
根据给定的地址族、套接字类型以及协议类型参数,创建一个新的套接字对象。注意,在大多数情况下不需要指定proto,也不建议这样做,因为某些MicroPython端口可能会省略 IPPROTO_*
常量。
参数描述:
af
- 地址族(参考常量说明)。type
- socket类型(参考常量说明)。proto
- 协议号(参考常量说明)。
示例:
import usocket
# 创建基于TCP的流式套接字
socket = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM)
# 创建基于UDP的数据报套接字
socket = usocket.socket(usocket.AF_INET, usocket.SOCK_DGRAM)
# 创建基于TCP的服务端套接字
socket = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM, usocket.IPPROTO_TCP_SER)
# 创建基于TCP的客户端套接字(配合bind使用,可自定义socket address)
socket = usocket.socket(usocket.AF_INET, usocket.SOCK_STREAM, usocket.TCP_CUSTOMIZE_PORT)
usocket.getaddrinfo
usocket.getaddrinfo(host, port)
DNS域名解析,将主机域名(host)和端口(port)解析为用于创建套接字的5元组序列,元组结构如下:
(family, type, proto, canonname, sockaddr)
参数描述:
host
- 主机域名。port
- 端口。
返回值描述:
family
- 地址族(参考常量说明)。type
- socket类型(参考常量说明)。proto
- 协议号(参考常量说明)。canonname
- 主机域名。sockaddr
- 包含地址和端口号的列表。
方法
socket.bind
socket.bind(address)
该方法用于套接字绑定指定address,必须尚未绑定。
1.作为服务器时,需要进行绑定,以固定服务器的address。
2.作为客户端时,绑定address用来指定套接字进行数据处理(配合usocket.TCP_CUSTOMIZE_PORT使用)。
参数描述
address
- 包含地址和端口号的元组或列表。
示例:
#绑定指定address
socket.bind(("192.168.0.1",80))
#绑定拨号IP,端口自定义(端口为0时,会自动分配)
socket.bind(("",0))
socket.listen
socket.listen(backlog)
该方法用于套接字服务端开启监听客户端连接,可指定最大客户端连接数。
参数描述:
backlog
- 接受套接字的最大个数,至少为0。
socket.accept
socket.accept()
该方法用于套接字服务端接受连接请求,成功返回元组,包含新的套接字和客户端地址以及客户端端口,形式为:(conn, address, port)
。
返回值:
conn
- 新的套接字对象,用来和客户端交互。address
- 连接到服务器的客户端地址。port
- 连接到服务器的客户端端口。
socket.connect
socket.connect(address)
该方法用于套接字连接到指定address的服务器。
参数描述:
address
- 包含地址和端口号的元组或列表。
示例:
#连接指定address
socket.connect(("192.168.0.1",80))
socket.read
socket.read( [ size ] )
该方法用于从套接字中读取size字节数据,返回一个字节对象。如果没有指定size,则会从套接字读取所有可读数据,直到读取到数据结束,此时作用和 socket.readall()
相同。
socket.readinto
socket.readinto(buf, [ , nbytes ])
该方法用于从套接字读取字节到缓冲区buf中。如果指定了nbytes,则最多读取nbytes数量的字节;如果没有指定nbytes,则最多读取len(buf)字节。返回值是实际读取的字节数。
socket.readline
socket.readline()
该方法用于从套接字按行读取数据,遇到换行符结束,返回读取的数据行。
socket.write
socket.write(buf)
该方法用于套接字发送缓冲区的数据,buf为待发送的数据,返回实际发送的字节数。
socket.send
socket.send(bytes)
该方法用于套接字发送数据,返回实际发送的字节数。
参数描述:
bytes
- bytes型数据。
socket.sendall
socket.sendall(bytes)
该方法用于套接字将所有数据都发送到套接字。与send()
方法不同的是,此方法将尝试通过依次逐块发送数据来发送所有数据。
该方法再非阻塞套接字上的行为是不确定的,建议在MicroPython中,使用
write()
方法,该方法具有相同的“禁止短写”策略来阻塞套接字,并且将返回在非阻塞套接字上发送的字节数。
参数描述:
bytes
- bytes型数据。
socket.sendto
socket.sendto(bytes, address)
该方法用于套接字发送数据到指定address,返回实际发送的字节数。
参数描述:
bytes
- bytes型数据。address
- 包含地址和端口号的元组或列表。
socket.recv
socket.recv(bufsize)
该方法用于从套接字接收数据。返回值是一个字节对象,表示接收到的数据。一次接收的最大数据量由bufsize指定。
参数描述:
bufsize
- 一次接收的最大数据量。
socket.recvfrom
socket.recvfrom(bufsize)
该方法用于从套接字接收数据。返回一个元组,包含字节对象和地址。返回值形式为:(bytes, address)
。
参数描述:
bufsize
- 一次接收的最大数据量。
返回值:
bytes
:接收数据的字节对象。address
:发送数据的套接字的地址。
socket.close
socket.close()
该方法用于将套接字标记为关闭并释放所有资源。
socket.setsockopt
socket.setsockopt(level, optname, value)
该方法用于设置套接字选项的值。
参数描述:
level
- 套接字选项级别。optname
- socket功能选项。value
- 既可以是一个整数,也可以是一个表示缓冲区的bytes类对象。
示例:
#设置端口复用允许
socket.setsockopt(usocket.SOL_SOCKET, usocket.SO_REUSEADDR, 1)
#设置TCP保活包间隔时间,value 单位为分钟,范围:1-120
socket.setsockopt(usocket.SOL_SOCKET, usocket.TCP_KEEPALIVE, 1)
socket.setblocking
socket.setblocking(flag)
该方法用于设置套接字为阻塞模式或者非阻塞模式。该方法是 settimeout()
调用的简写。
参数描述:
flag
- 设置套接字是否阻塞(默认为阻塞模式)。
示例:
#将套接字设置为阻塞
`socket.setblocking(True)` 相当于 `socket.settimeout(None)`
#将套接字设置为非阻塞
`socket.setblocking(False)` 相当于 `socket.settimeout(0)`
socket.settimeout
socket.settimeout(value)
该方法用于设置套接字的发送和接收数据超时时间,单位秒。
参数描述:
value
- 可以是表示秒的非负浮点数,也可以是None。如果给定零,则将套接字置为非阻塞模式,否则套接字将处于阻塞模式。
socket.makefile
socket.makefile(mode='rb')
该方法用于返回与套接字关联的文件对象,返回值类型与指定的参数有关。仅支持二进制模式 (rb和wb)。
socket.getsocketsta
socket.getsocketsta()
该方法用于获取TCP套接字的状态。
1.BG95平台不支持该API。
2.如果调用了socket.close()
方法之后,再调用socket.getsocketsta()
会返回-1,因为此时创建的对象资源等都已经被释放。
返回值:
状态值 | 状态 | 描述 |
---|---|---|
0 | CLOSED | 套接字创建了,但没有使用这个套接字 |
1 | LISTEN | 套接字正在监听连接 |
2 | SYN_SENT | 套接字正在试图主动建立连接,即发送SYN后还没有收到ACK |
3 | SYN_RCVD | 套接字正在处于连接的初始同步状态,即收到对方的SYN,但还没收到自己发过去的SYN的ACK |
4 | ESTABLISHED | 套接字已成功建立连接 |
5 | FIN_WAIT_1 | 套接字已关闭,正在关闭连接,即发送FIN,没有收到ACK也没有收到FIN |
6 | FIN_WAIT_2 | 套接字已关闭,正在等待远程套接字关闭,即在FIN_WAIT_1状态下收到发过去FIN对应的ACK |
7 | CLOSE_WAIT | 远程套接字已经关闭,正在等待关闭这个套接字,被动关闭的一方收到FIN |
8 | CLOSING | 套接字已关闭,远程套接字正在关闭,暂时挂起关闭确认,即在FIN_WAIT_1状态下收到被动方的FIN |
9 | LAST_ACK | 远程套接字已关闭,正在等待本地套接字的关闭确认,被动方在CLOSE_WAIT状态下发送FIN |
10 | TIME_WAIT | 套接字已经关闭,正在等待远程套接字的关闭,即FIN、ACK、FIN、ACK都完毕,经过2MSL时间后变为CLOSED状态 |
常量
usocket.AF_INET
地址族,IPV4类型。
usocket.AF_INET6
地址族,IPV6类型。
usocket.SOCK_STREAM
socket类型,TCP的流式套接字。
usocket.SOCK_DGRAM
socket类型,UDP的数据包套接字。
usocket.SOCK_RAW
socket类型,原始套接字。
usocket.IPPROTO_TCP
协议号,TCP协议。
usocket.IPPROTO_UDP
协议号,UDP协议。
usocket.IPPROTO_TCP_SER
协议号,TCP服务器。
usocket.TCP_CUSTOMIZE_PORT
协议号,TCP客户端自定义address使用。
usocket.SOL_SOCKET
套接字选项级别。
usocket.SO_REUSEADDR
socket功能选项,允许设置端口复用。
usocket.TCP_KEEPALIVE
socket功能选项,设置TCP保活包间隔时间。