TCP 服务端

UIFLOW2 应用示例

回显服务器

在 UiFlow2 中打开 cores3_tcp_server_example.m5f2 项目。

此示例创建一个回显接收数据的 TCP 服务器。

UiFlow2 代码块:

cores3_tcp_server_example.png

示例输出:

None

MicroPython 应用示例

回显服务器

此示例创建一个回显接收数据的 TCP 服务器。

MicroPython 代码块:

  1# SPDX-FileCopyrightText: 2025 M5Stack Technology CO LTD
  2#
  3# SPDX-License-Identifier: MIT
  4
  5import os, sys, io
  6import M5
  7from M5 import *
  8import network
  9import socket
 10
 11
 12label0 = None
 13label1 = None
 14label2 = None
 15label3 = None
 16label4 = None
 17label5 = None
 18label6 = None
 19label7 = None
 20label8 = None
 21label9 = None
 22title0 = None
 23wlan = None
 24tcps = None
 25
 26
 27con_info = None
 28con_sock = None
 29address = None
 30data = None
 31
 32
 33def setup():
 34    global \
 35        label0, \
 36        label1, \
 37        label2, \
 38        label3, \
 39        label4, \
 40        label5, \
 41        label6, \
 42        label7, \
 43        label8, \
 44        label9, \
 45        title0, \
 46        wlan, \
 47        tcps, \
 48        con_info, \
 49        con_sock, \
 50        address, \
 51        data
 52
 53    M5.begin()
 54    Widgets.fillScreen(0x222222)
 55    label0 = Widgets.Label("Local IP:", 4, 32, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
 56    label1 = Widgets.Label("Local Port:", 4, 60, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
 57    label2 = Widgets.Label("Remote IP:", 4, 88, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
 58    label3 = Widgets.Label("Remote Port:", 4, 118, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
 59    label4 = Widgets.Label("Data:", 4, 144, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
 60    label5 = Widgets.Label("label5", 136, 32, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
 61    label6 = Widgets.Label("label6", 136, 60, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
 62    label7 = Widgets.Label("label7", 136, 88, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
 63    label8 = Widgets.Label("label8", 136, 118, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
 64    label9 = Widgets.Label("label9", 136, 144, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
 65    title0 = Widgets.Title("TCP Server", 3, 0xFFFFFF, 0x0000FF, Widgets.FONTS.DejaVu24)
 66
 67    wlan = network.WLAN(network.STA_IF)
 68    wlan.active(True)
 69    tcps = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 70    tcps.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
 71    tcps.bind(("0.0.0.0", 8001))
 72    tcps.listen(5)
 73    tcps.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
 74    label5.setText(str(wlan.ifconfig()[0]))
 75    label6.setText(str("8001"))
 76
 77
 78def loop():
 79    global \
 80        label0, \
 81        label1, \
 82        label2, \
 83        label3, \
 84        label4, \
 85        label5, \
 86        label6, \
 87        label7, \
 88        label8, \
 89        label9, \
 90        title0, \
 91        wlan, \
 92        tcps, \
 93        con_info, \
 94        con_sock, \
 95        address, \
 96        data
 97    M5.update()
 98    con_info = tcps.accept()
 99    con_sock = con_info[0]
100    address = con_info[1]
101    label7.setText(str(address[0]))
102    label8.setText(str(address[1]))
103    while True:
104        data = con_sock.recv(1024)
105        label9.setText(str(data))
106        con_sock.send(data)
107
108
109if __name__ == "__main__":
110    try:
111        setup()
112        while True:
113            loop()
114    except (Exception, KeyboardInterrupt) as e:
115        try:
116            from utility import print_error_msg
117
118            print_error_msg(e)
119        except ImportError:
120            print("please update to latest firmware")

示例输出:

None

API参考

socket.socket()
socket.bind(address)
socket.listen([backlog])

创建一个套接字对象并将其绑定到一个地址。

参数:
  • address (tuple) – 包含服务器 IP 地址和端口号的元组。

  • backlog (int) – 排队连接的最大数量。默认值为 5。

返回:

一个套接字对象。

返回类型:

socket.socket

UiFlow2 代码块:

init.png

MicroPython 代码块:

import socket

tcps = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcps.bind(('0.0.0.0', 8001))
tcps.listen(5)
socket.close()

关闭套接字连接。

UiFlow2 代码块:

close.png

close_client.png

MicroPython 代码块:

tcps.close()
socket.accept()

接受连接。套接字必须绑定到地址并监听连接。返回值是一对 (conn, address),其中 conn 是可用于在连接上发送和接收数据的新套接字对象,address 是绑定到连接另一端套接字的地址。

返回:

包含客户端套接字和客户端地址的元组。

返回类型:

tuple

UiFlow2 代码块:

accept.png

MicroPython 代码块:

client_socket, addr = tcps.accept()
print('Connected by', addr)
socket.recv(bufsize)

从套接字接收数据。

参数:

bufsize (int) – 一次可接收的最大数据量。

返回:

接收到的数据。

返回类型:

bytes

UiFlow2 代码块:

recv.png

MicroPython 代码块:

data = tcps.recv(1024)
print(data)
socket.read()

从套接字读取数据。

返回:

接收到的数据。

返回类型:

bytes

UiFlow2 代码块:

read.png

MicroPython 代码块:

data = tcps.read()
print(data)
socket.send(data)

向套接字发送数据。该套接字必须连接到远程套接字。

参数:

data (bytes | str) – 要发送的数据。

返回:

已发送的字节数。

返回类型:

int

UiFlow2 代码块:

send.png

MicroPython 代码块:

tcps.send(b'Hello, World!')
tcps.send('Hello, World!')
socket.write(data)

将字节缓冲区写入套接字。此函数将尝试将所有数据写入套接字(无“短写入”)。不过,对于非阻塞套接字,这可能无法实现,并且返回的值将小于 buf 的长度。

参数:

data (bytes | str) – 要发送的数据。

返回:

已发送的字节数。

返回类型:

int

UiFlow2 代码块:

write.png

MicroPython 代码块:

tcps.write(b'Hello, World!')
tcps.write('Hello, World!')
socket.setblocking(flag)

设置套接字的阻塞或非阻塞模式:如果标志为假,则套接字设置为非阻塞,否则设置为阻塞模式。

此方法是某些 settimeout() 调用的简写:

  • sock.setblocking(True) 等同于 sock.settimeout(None)

  • sock.setblocking(False) 等同于 sock.settimeout(0)

param bool flag:

如果为 True,套接字将处于阻塞模式。如果为 False,套接字将处于非阻塞模式。

return:

None

rtype:

None

UiFlow2 代码块:

setblocking.png

MicroPython 代码块:

tcps.setblocking(True)
tcps.setblocking(False)
socket.settimeout(timeout)

设置阻塞套接字操作的超时时间。值参数可以是表示秒数的非负浮点数,也可以是 None。如果给出了非零值,则在操作完成之前如果超时时间值已过,则后续套接字操作将引发 OSError 异常。如果给出了零,则套接字将处于非阻塞模式。如果给出了 None,则套接字将处于阻塞模式。

参数:

timeout (float) – 超时值(以秒为单位)。如果为 None,则套接字将处于阻塞模式。

返回:

None

返回类型:

None

UiFlow2 代码块:

settimeout.png

MicroPython 代码块:

tcps.settimeout(5)
tcps.settimeout(None)
socket.setsockopt(level, optname, value)

设置给定套接字选项的值。所需的符号常量在套接字模块中定义(SO_* 等)。该值可以是整数或表示缓冲区的字节类对象。

参数:
  • level (int) – 定义选项的级别。

  • optname (int) – 要设置的选项的名称。

  • value – 为选项设置的值。

UiFlow2 代码块:

setsockopt.png

MicroPython 代码块:

tcps.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 0)
tcps.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)