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,因为此时创建的对象资源等都已经被释放。

  •