2.3 socket 模块API手册#
前言#
概述#
本文档主要介绍soccket模块API。
读者对象#
本文档(本指南)主要适用于以下人员:
技术支持工程师
软件开发工程师
缩略词定义#
简称 |
说明 |
---|
修订记录#
文档版本号 |
修改说明 |
修改者 |
日期 |
---|---|---|---|
V1.0 |
初版 |
软件部 |
2023-11-09 |
1. 概述#
封装socket库,需要通过核间通信调用小核的socket接口。
2.示例#
#配置 tcp/udp socket调试工具
import socket
import time
PORT=60000
def client():
#获取地址及端口号 对应地址
ai = socket.getaddrinfo("10.100.228.5", PORT)
#ai = socket.getaddrinfo("10.10.1.94", PORT)
print("Address infos:", ai)
addr = ai[0][-1]
print("Connect address:", addr)
#建立socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
#连接地址
s.connect(addr)
for i in range(10):
str="K230 tcp client send test {0} \r\n".format(i)
print(str)
#print(s.send(str))
#发送字符串
print(s.write(str))
time.sleep(0.2)
#time.sleep(1)
#print(s.recv(4096))
#print(s.read())
#延时1秒
time.sleep(1)
#关闭socket
s.close()
print("end")
#main()
client()
3. api定义#
详见 https://docs.micropython.org/en/latest/library/socket.html
3.1 构造函数#
class socket.socket(af=AF_INET, type=SOCK_STREAM, proto=IPPROTO_TCP, /)¶
使用给定的地址族、套接字类型和协议号创建一个新的套接字。注意,在大多数情况下,指定proto不是必需的 (因为某些MicroPython端口可能省略
IPPROTO_*
常量)。 相反,type 参数将自动选择所需的协议:创建一个STREAM TCP套接字:
socket(AF_INET, SOCK_STREAM)
创建一个DGRAM UDP套接字:
socket(AF_INET, SOCK_DGRAM)
3.2 方法#
socket.close()¶
关闭套接字并释放所有资源。一旦调用此接口,对套接字对象的所有未来操作方法都将失败。如果协议支持,远程端将收到EOF指示。 套接字在垃圾回收时也会自动关闭,但建议在完成工作后显式地调用
close()
方法关闭套接字。socket.bind(address)¶
将套接字绑定到 对应的ip 地址。方法调用前要确保套接字不能已经被绑定。
socket.listen([backlog])¶
使服务器能够接受客户端连接。backlog 表示一次能够等待的最大连接数目,它最小为0(如果比0更低,则会被设置为0)。如果未指定,则选择一个默认值。
socket.accept()¶
接受一个客户端的连接。在此之前套接字必须先绑定到一个地址并侦听连接。返回值为(conn, address),其中conn是一个新套接字对象,可用于在此连接上发送和接收数据,而address是连接客户端套接字所绑定的地址。
socket.connect(address)¶
与address 的服务端套接字建立连接。
socket.send(bytes)¶
向套接字发送数据。套接字必须已经建立连接。返回发送的字节数,这可能小于数据的长度(“short write”短写)。
socket.sendall(bytes)¶
向套接字发送所有数据。套接字必须连接到远程套接字。与
send()
不同,此方法将尝试通过逐块连续发送数据来发送所有数据。此方法在非阻塞套接字上的行为未定义,因此,在MicroPython中,建议使用write()
方法,它在阻塞套接字上有相同的“无短写”策略,并将在非阻塞套接字上返回发送的字节数。socket.recv(bufsize)¶
从套接字接收数据。返回值是一个表示接收数据的字节对象。一次接收的最大数据量由 bufsize 指定。
socket.sendto(bytes, address)¶
向套接字发送数据。套接字不应连接到远程套接字,发送目标套接字由 address 指定。
socket.recvfrom(bufsize)¶
从套接字接收数据。返回值是 (bytes, address),其中 bytes 表示接收数据的字节对象,address 是发送数据的套接字的地址。
socket.setsockopt(level, optname, value)¶
设置给定套接字选项的值。所需的符号常量在套接字模块中定义(SO_* 等)。value 可以是一个整数或一个表示缓冲区的字节类对象。
socket.settimeout(value)¶
设置阻塞套接字操作的超时时间(注意:并非每个端口都支持此方法)。
value
参数可以是一个表示秒的非负浮点数,或者是None
。如果给定非零值,则在超时value
时间操作还尚未完成时,后续的套接字操作将引发OSError
异常。如果给定值为零,则将套接字置于非阻塞模式。如果给定None
,则将套接字置于阻塞模式。并非每个 MicroPython 端口都支持此方法。更通用的解决方案是使用select.poll
对象,允许同时等待多个对象(不仅仅是套接字,还可以是支持轮询的通用stream
对象)。例如:#被替代部分 s.settimeout(1.0) # 时间以秒为单位 s.read(10) # 可能超时 #可替换为: poller = select.poll() poller.register(s, select.POLLIN) res = poller.poll(1000) # 时间以毫秒为单位 if not res: # s 仍然未准备好输入,即操作超时
与CPython的区别:CPython在超时情况下会引发
socket.timeout
异常,这是OSError
的子类。MicroPython直接引发OSError
。如果使用except OSError:
来捕获异常,你的代码将在MicroPython和CPython中都能正常工作。socket.setblocking(flag)¶
设置套接字的阻塞或非阻塞模式:如果
flag
为False
,则将套接字设置为非阻塞模式,否则设置为阻塞模式。此方法可替换settimeout()
:sock.setblocking(True) # 等同于 sock.settimeout(None) sock.setblocking(False) # 等同于 sock.settimeout(0)
socket.makefile(mode=’rb’, buffering=0, /)¶
返回与套接字关联的文件对象。具体返回类型取决于传递给
makefile()
的参数。仅支持二进制模式(如rb
、wb
和rwb
)。CPython的参数:encoding
、errors
和newline
不受支持。与CPython的区别:由于MicroPython不支持缓冲流,
buffering
参数的值被忽略,并视为0(无缓冲)。关闭由makefile()
返回的文件对象将关闭原始套接字。socket.read([size])¶
从套接字读取最多
size
字节。返回一个字节对象。如果未给定size
,则读取套接字中所有可用的数据直到EOF;因此该方法将在套接字关闭之前不会返回。此函数尝试读取请求的尽可能多的数据(无“短读”)。但对于非阻塞套接字,可能将返回比size少的数据。socket.readinto(buf**[, nbytes]**)¶
将字节读取到
buf
中。如果指定了nbytes
,则最多读取该字节数。否则,最多读取len(buf)
字节。与recv()
类似,此方法尝试尽可能读取多的数据(无“短读”)。但对于非阻塞套接字,可能将返回比size少的数据。socket.readline()¶
从套接字读取一行数据。返回值: 一行数据。
socket.write(buf)¶
将字节缓冲区写入套接字。此函数将尝试将所有数据写入套接字(无“短写”)。但对于非阻塞套接字,可能将返回小于
buf
的长度。返回值:写入的字节数。exceptionsocket.error¶
MicroPython没有此异常。
与CPython的区别:CPython过去有一个
socket.error
异常,但现在已被弃用,并且是 OSError 的别名。在MicroPython中,直接使用 OSError。