TCP 服务端
UIFLOW2 应用示例
回显服务器
在 UiFlow2 中打开 cores3_tcp_server_example.m5f2 项目。
此示例创建一个回显接收数据的 TCP 服务器。
UiFlow2 代码块:
示例输出:
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])
创建一个套接字对象并将其绑定到一个地址。
- 参数:
- 返回:
一个套接字对象。
- 返回类型:
UiFlow2 代码块:

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 代码块:


MicroPython 代码块:
tcps.close()
- socket.accept()
接受连接。套接字必须绑定到地址并监听连接。返回值是一对 (conn, address),其中 conn 是可用于在连接上发送和接收数据的新套接字对象,address 是绑定到连接另一端套接字的地址。
- 返回:
包含客户端套接字和客户端地址的元组。
- 返回类型:
UiFlow2 代码块:

MicroPython 代码块:
client_socket, addr = tcps.accept() print('Connected by', addr)
- socket.recv(bufsize)
从套接字接收数据。
UiFlow2 代码块:

MicroPython 代码块:
data = tcps.recv(1024) print(data)
- socket.read()
从套接字读取数据。
- 返回:
接收到的数据。
- 返回类型:
UiFlow2 代码块:

MicroPython 代码块:
data = tcps.read() print(data)
- socket.send(data)
向套接字发送数据。该套接字必须连接到远程套接字。
UiFlow2 代码块:

MicroPython 代码块:
tcps.send(b'Hello, World!') tcps.send('Hello, World!')
- socket.write(data)
将字节缓冲区写入套接字。此函数将尝试将所有数据写入套接字(无“短写入”)。不过,对于非阻塞套接字,这可能无法实现,并且返回的值将小于 buf 的长度。
UiFlow2 代码块:

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 代码块:

MicroPython 代码块:
tcps.setblocking(True) tcps.setblocking(False)
- socket.settimeout(timeout)
设置阻塞套接字操作的超时时间。值参数可以是表示秒数的非负浮点数,也可以是 None。如果给出了非零值,则在操作完成之前如果超时时间值已过,则后续套接字操作将引发 OSError 异常。如果给出了零,则套接字将处于非阻塞模式。如果给出了 None,则套接字将处于阻塞模式。
- 参数:
timeout (float) – 超时值(以秒为单位)。如果为 None,则套接字将处于阻塞模式。
- 返回:
None
- 返回类型:
None
UiFlow2 代码块:

MicroPython 代码块:
tcps.settimeout(5) tcps.settimeout(None)
- socket.setsockopt(level, optname, value)
设置给定套接字选项的值。所需的符号常量在套接字模块中定义(SO_* 等)。该值可以是整数或表示缓冲区的字节类对象。
UiFlow2 代码块:

MicroPython 代码块:
tcps.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 0) tcps.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
