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)

    设置套接字的阻塞或非阻塞模式:如果 flagFalse,则将套接字设置为非阻塞模式,否则设置为阻塞模式。此方法可替换settimeout()

    sock.setblocking(True)  # 等同于 sock.settimeout(None)
    sock.setblocking(False)  # 等同于 sock.settimeout(0)
    
  • socket.makefile(mode=’rb’, buffering=0, /)

    返回与套接字关联的文件对象。具体返回类型取决于传递给 makefile() 的参数。仅支持二进制模式(如 rbwbrwb)。CPython的参数:encodingerrorsnewline 不受支持。

    与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