EasyTCPClient
EasyTCPClient provides a simple way to create TCP clients in an event-driven manner.
UiFlow2 Example
simple client
Open the cores3_simple_client_example.m5f2 project in UiFlow2.
This example creates a TCP client that connects to a server and sends data.
UiFlow2 Code Block:
Example output:
None
MicroPython Example
simple client
This example creates a TCP client that connects to a server and sends data.
MicroPython Code Block:
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 m5ui 9import lvgl as lv 10from easysocket import EasyTCPClient 11import network 12 13 14page0 = None 15button0 = None 16button1 = None 17label0 = None 18button2 = None 19textarea0 = None 20keyboard0 = None 21label1 = None 22textarea1 = None 23textarea2 = None 24label3 = None 25wlan_sta = None 26tcpc_0 = None 27 28 29state = None 30 31 32def button0_short_clicked_event(event_struct): 33 global \ 34 page0, \ 35 button0, \ 36 button1, \ 37 label0, \ 38 button2, \ 39 textarea0, \ 40 keyboard0, \ 41 label1, \ 42 textarea1, \ 43 textarea2, \ 44 label3, \ 45 wlan_sta, \ 46 tcpc_0, \ 47 state 48 state = not state 49 if state: 50 tcpc_0.connect() 51 button0.set_btn_text(str("connecting")) 52 button0.set_bg_color(0xFFCC66, 255, lv.PART.MAIN | lv.STATE.DEFAULT) 53 else: 54 tcpc_0.close() 55 button0.set_btn_text(str("connect")) 56 button0.set_bg_color(0x3366FF, 255, lv.PART.MAIN | lv.STATE.DEFAULT) 57 58 59def tcpc_0_connect_event(client_sock): 60 global \ 61 page0, \ 62 button0, \ 63 button1, \ 64 label0, \ 65 button2, \ 66 textarea0, \ 67 keyboard0, \ 68 label1, \ 69 textarea1, \ 70 textarea2, \ 71 label3, \ 72 wlan_sta, \ 73 tcpc_0, \ 74 state 75 button0.set_btn_text(str("connected")) 76 button0.set_bg_color(0xFF0000, 255, lv.PART.MAIN | lv.STATE.DEFAULT) 77 78 79def tcpc_0_disconnect_event(client_sock): 80 global \ 81 page0, \ 82 button0, \ 83 button1, \ 84 label0, \ 85 button2, \ 86 textarea0, \ 87 keyboard0, \ 88 label1, \ 89 textarea1, \ 90 textarea2, \ 91 label3, \ 92 wlan_sta, \ 93 tcpc_0, \ 94 state 95 button0.set_btn_text(str("connect")) 96 button0.set_bg_color(0x3366FF, 255, lv.PART.MAIN | lv.STATE.DEFAULT) 97 98 99def textarea0_focused_event(event_struct): 100 global \ 101 page0, \ 102 button0, \ 103 button1, \ 104 label0, \ 105 button2, \ 106 textarea0, \ 107 keyboard0, \ 108 label1, \ 109 textarea1, \ 110 textarea2, \ 111 label3, \ 112 wlan_sta, \ 113 tcpc_0, \ 114 state 115 keyboard0.set_flag(lv.obj.FLAG.HIDDEN, False) 116 keyboard0.set_textarea(textarea0) 117 118 119def textarea0_defocused_event(event_struct): 120 global \ 121 page0, \ 122 button0, \ 123 button1, \ 124 label0, \ 125 button2, \ 126 textarea0, \ 127 keyboard0, \ 128 label1, \ 129 textarea1, \ 130 textarea2, \ 131 label3, \ 132 wlan_sta, \ 133 tcpc_0, \ 134 state 135 keyboard0.set_flag(lv.obj.FLAG.HIDDEN, True) 136 137 138def textarea1_focused_event(event_struct): 139 global \ 140 page0, \ 141 button0, \ 142 button1, \ 143 label0, \ 144 button2, \ 145 textarea0, \ 146 keyboard0, \ 147 label1, \ 148 textarea1, \ 149 textarea2, \ 150 label3, \ 151 wlan_sta, \ 152 tcpc_0, \ 153 state 154 keyboard0.set_flag(lv.obj.FLAG.HIDDEN, False) 155 keyboard0.set_textarea(textarea1) 156 157 158def textarea1_defocused_event(event_struct): 159 global \ 160 page0, \ 161 button0, \ 162 button1, \ 163 label0, \ 164 button2, \ 165 textarea0, \ 166 keyboard0, \ 167 label1, \ 168 textarea1, \ 169 textarea2, \ 170 label3, \ 171 wlan_sta, \ 172 tcpc_0, \ 173 state 174 keyboard0.set_flag(lv.obj.FLAG.HIDDEN, True) 175 176 177def textarea2_focused_event(event_struct): 178 global \ 179 page0, \ 180 button0, \ 181 button1, \ 182 label0, \ 183 button2, \ 184 textarea0, \ 185 keyboard0, \ 186 label1, \ 187 textarea1, \ 188 textarea2, \ 189 label3, \ 190 wlan_sta, \ 191 tcpc_0, \ 192 state 193 keyboard0.set_flag(lv.obj.FLAG.HIDDEN, False) 194 keyboard0.set_textarea(textarea2) 195 196 197def textarea2_defocused_event(event_struct): 198 global \ 199 page0, \ 200 button0, \ 201 button1, \ 202 label0, \ 203 button2, \ 204 textarea0, \ 205 keyboard0, \ 206 label1, \ 207 textarea1, \ 208 textarea2, \ 209 label3, \ 210 wlan_sta, \ 211 tcpc_0, \ 212 state 213 keyboard0.set_flag(lv.obj.FLAG.HIDDEN, True) 214 215 216def button2_short_clicked_event(event_struct): 217 global \ 218 page0, \ 219 button0, \ 220 button1, \ 221 label0, \ 222 button2, \ 223 textarea0, \ 224 keyboard0, \ 225 label1, \ 226 textarea1, \ 227 textarea2, \ 228 label3, \ 229 wlan_sta, \ 230 tcpc_0, \ 231 state 232 textarea2.set_text("") 233 234 235def button1_short_clicked_event(event_struct): 236 global \ 237 page0, \ 238 button0, \ 239 button1, \ 240 label0, \ 241 button2, \ 242 textarea0, \ 243 keyboard0, \ 244 label1, \ 245 textarea1, \ 246 textarea2, \ 247 label3, \ 248 wlan_sta, \ 249 tcpc_0, \ 250 state 251 tcpc_0.send(textarea2.get_text()) 252 253 254def button0_event_handler(event_struct): 255 global \ 256 page0, \ 257 button0, \ 258 button1, \ 259 label0, \ 260 button2, \ 261 textarea0, \ 262 keyboard0, \ 263 label1, \ 264 textarea1, \ 265 textarea2, \ 266 label3, \ 267 wlan_sta, \ 268 tcpc_0, \ 269 state 270 event = event_struct.code 271 if event == lv.EVENT.SHORT_CLICKED and True: 272 button0_short_clicked_event(event_struct) 273 return 274 275 276def textarea0_event_handler(event_struct): 277 global \ 278 page0, \ 279 button0, \ 280 button1, \ 281 label0, \ 282 button2, \ 283 textarea0, \ 284 keyboard0, \ 285 label1, \ 286 textarea1, \ 287 textarea2, \ 288 label3, \ 289 wlan_sta, \ 290 tcpc_0, \ 291 state 292 event = event_struct.code 293 if event == lv.EVENT.FOCUSED and True: 294 textarea0_focused_event(event_struct) 295 if event == lv.EVENT.DEFOCUSED and True: 296 textarea0_defocused_event(event_struct) 297 return 298 299 300def textarea1_event_handler(event_struct): 301 global \ 302 page0, \ 303 button0, \ 304 button1, \ 305 label0, \ 306 button2, \ 307 textarea0, \ 308 keyboard0, \ 309 label1, \ 310 textarea1, \ 311 textarea2, \ 312 label3, \ 313 wlan_sta, \ 314 tcpc_0, \ 315 state 316 event = event_struct.code 317 if event == lv.EVENT.FOCUSED and True: 318 textarea1_focused_event(event_struct) 319 if event == lv.EVENT.DEFOCUSED and True: 320 textarea1_defocused_event(event_struct) 321 return 322 323 324def textarea2_event_handler(event_struct): 325 global \ 326 page0, \ 327 button0, \ 328 button1, \ 329 label0, \ 330 button2, \ 331 textarea0, \ 332 keyboard0, \ 333 label1, \ 334 textarea1, \ 335 textarea2, \ 336 label3, \ 337 wlan_sta, \ 338 tcpc_0, \ 339 state 340 event = event_struct.code 341 if event == lv.EVENT.FOCUSED and True: 342 textarea2_focused_event(event_struct) 343 if event == lv.EVENT.DEFOCUSED and True: 344 textarea2_defocused_event(event_struct) 345 return 346 347 348def button2_event_handler(event_struct): 349 global \ 350 page0, \ 351 button0, \ 352 button1, \ 353 label0, \ 354 button2, \ 355 textarea0, \ 356 keyboard0, \ 357 label1, \ 358 textarea1, \ 359 textarea2, \ 360 label3, \ 361 wlan_sta, \ 362 tcpc_0, \ 363 state 364 event = event_struct.code 365 if event == lv.EVENT.SHORT_CLICKED and True: 366 button2_short_clicked_event(event_struct) 367 return 368 369 370def button1_event_handler(event_struct): 371 global \ 372 page0, \ 373 button0, \ 374 button1, \ 375 label0, \ 376 button2, \ 377 textarea0, \ 378 keyboard0, \ 379 label1, \ 380 textarea1, \ 381 textarea2, \ 382 label3, \ 383 wlan_sta, \ 384 tcpc_0, \ 385 state 386 event = event_struct.code 387 if event == lv.EVENT.SHORT_CLICKED and True: 388 button1_short_clicked_event(event_struct) 389 return 390 391 392def setup(): 393 global \ 394 page0, \ 395 button0, \ 396 button1, \ 397 label0, \ 398 button2, \ 399 textarea0, \ 400 keyboard0, \ 401 label1, \ 402 textarea1, \ 403 textarea2, \ 404 label3, \ 405 wlan_sta, \ 406 tcpc_0, \ 407 state 408 409 M5.begin() 410 Widgets.setRotation(1) 411 m5ui.init() 412 page0 = m5ui.M5Page(bg_c=0xFFFFFF) 413 textarea0 = m5ui.M5TextArea( 414 text="textarea0", 415 placeholder="Placeholder...", 416 x=40, 417 y=6, 418 w=70, 419 h=36, 420 font=lv.font_montserrat_14, 421 bg_c=0xFFFFFF, 422 border_c=0xE0E0E0, 423 text_c=0x212121, 424 parent=page0, 425 ) 426 textarea1 = m5ui.M5TextArea( 427 text="textarea0", 428 placeholder="Placeholder...", 429 x=178, 430 y=6, 431 w=56, 432 h=36, 433 font=lv.font_montserrat_14, 434 bg_c=0xFFFFFF, 435 border_c=0xE0E0E0, 436 text_c=0x212121, 437 parent=page0, 438 ) 439 textarea2 = m5ui.M5TextArea( 440 text="", 441 placeholder="Placeholder...", 442 x=6, 443 y=76, 444 w=232, 445 h=158, 446 font=lv.font_montserrat_14, 447 bg_c=0xFFFFFF, 448 border_c=0xE0E0E0, 449 text_c=0x212121, 450 parent=page0, 451 ) 452 button0 = m5ui.M5Button( 453 text="connect", 454 x=239, 455 y=6, 456 bg_c=0x214FF3, 457 text_c=0xFFFFFF, 458 font=lv.font_montserrat_14, 459 parent=page0, 460 ) 461 button1 = m5ui.M5Button( 462 text="send", 463 x=248, 464 y=76, 465 bg_c=0x214FF3, 466 text_c=0xFFFFFF, 467 font=lv.font_montserrat_14, 468 parent=page0, 469 ) 470 label0 = m5ui.M5Label( 471 "IP:", 472 x=6, 473 y=10, 474 text_c=0x000000, 475 bg_c=0xFFFFFF, 476 bg_opa=0, 477 font=lv.font_montserrat_24, 478 parent=page0, 479 ) 480 button2 = m5ui.M5Button( 481 text="clear", 482 x=248, 483 y=201, 484 bg_c=0x214FF3, 485 text_c=0xFFFFFF, 486 font=lv.font_montserrat_14, 487 parent=page0, 488 ) 489 keyboard0 = m5ui.M5Keyboard( 490 x=0, 491 y=119, 492 w=320, 493 h=120, 494 mode=lv.keyboard.MODE.TEXT_LOWER, 495 target_textarea=None, 496 parent=page0, 497 ) 498 label1 = m5ui.M5Label( 499 "Port:", 500 x=116, 501 y=10, 502 text_c=0x000000, 503 bg_c=0xFFFFFF, 504 bg_opa=0, 505 font=lv.font_montserrat_24, 506 parent=page0, 507 ) 508 label3 = m5ui.M5Label( 509 "Data:", 510 x=6, 511 y=50, 512 text_c=0x000000, 513 bg_c=0xFFFFFF, 514 bg_opa=0, 515 font=lv.font_montserrat_14, 516 parent=page0, 517 ) 518 519 button0.add_event_cb(button0_event_handler, lv.EVENT.ALL, None) 520 textarea0.add_event_cb(textarea0_event_handler, lv.EVENT.ALL, None) 521 textarea1.add_event_cb(textarea1_event_handler, lv.EVENT.ALL, None) 522 textarea2.add_event_cb(textarea2_event_handler, lv.EVENT.ALL, None) 523 button2.add_event_cb(button2_event_handler, lv.EVENT.ALL, None) 524 button1.add_event_cb(button1_event_handler, lv.EVENT.ALL, None) 525 526 page0.screen_load() 527 wlan_sta = network.WLAN(network.STA_IF) 528 wlan_sta.active(True) 529 button0.set_size(74, 36) 530 textarea0.set_one_line(True) 531 textarea1.set_one_line(True) 532 textarea0.set_text(str(wlan_sta.ifconfig()[0])) 533 textarea1.set_text(str("8000")) 534 state = True 535 tcpc_0 = EasyTCPClient("192.168.8.196", 8000) 536 tcpc_0.on_connect(tcpc_0_connect_event) 537 tcpc_0.on_disconnect(tcpc_0_disconnect_event) 538 button0.set_btn_text(str("connecting")) 539 keyboard0.set_flag(lv.obj.FLAG.HIDDEN, True) 540 541 542def loop(): 543 global \ 544 page0, \ 545 button0, \ 546 button1, \ 547 label0, \ 548 button2, \ 549 textarea0, \ 550 keyboard0, \ 551 label1, \ 552 textarea1, \ 553 textarea2, \ 554 label3, \ 555 wlan_sta, \ 556 tcpc_0, \ 557 state 558 M5.update() 559 tcpc_0.check_event(timeout=-1) 560 561 562if __name__ == "__main__": 563 try: 564 setup() 565 while True: 566 loop() 567 except (Exception, KeyboardInterrupt) as e: 568 try: 569 m5ui.deinit() 570 from utility import print_error_msg 571 572 print_error_msg(e) 573 except ImportError: 574 print("please update to latest firmware")
Example output:
None
API
- class software.easysocket.tcp_client.EasyTCPClient(remote_host, remote_port, timeout=10)
Bases:
objectCreate an EasyTCPClient object.
- Parameters:
Note
connection is initiated in the background when the object is created.
Note
This class is non-blocking and event-driven. You need to call check_event() periodically to process events.
UiFlow2 Code Block:

MicroPython Code Block:
from easysocket.tcp_client import EasyTCPClient client = EasyTCPClient("192.168.1.100", 8080)
- connect()
Connect to the remote server.
UiFlow2 Code Block:

MicroPython Code Block:
client.connect()
- on_connect(callback)
Set the callback function for connection event.
- Parameters:
callback – The callback function.
UiFlow2 Code Block:

MicroPython Code Block:
def on_connect_cb(client): print("Connected") client.on_connect(on_connect_cb)
- on_data_received(callback)
Set the callback function for data received event.
- Parameters:
callback – The callback function.
UiFlow2 Code Block:

MicroPython Code Block:
def on_data_received_cb(client, data): print("Received:", data) client.on_data_received(on_data_received_cb)
- on_disconnect(callback)
Set the callback function for disconnection event.
- Parameters:
callback – The callback function.
UiFlow2 Code Block:

MicroPython Code Block:
def on_disconnect_cb(client): print("Disconnected") client.on_disconnect(on_disconnect_cb)
- check_event(timeout=-1)
Check for events.
- Parameters:
timeout (int) – The timeout in milliseconds. Default is -1 (no timeout).
UiFlow2 Code Block:

MicroPython Code Block:
client.check_event()
- send(*args, **kwargs)
Send data to the remote server.
- Parameters:
data (bytes) – The data to send.
- Returns:
The number of bytes sent.
UiFlow2 Code Block:

MicroPython Code Block:
client.send(b"Hello")
- sendall(*args, **kwargs)
Send all data to the remote server.
- Parameters:
data (bytes) – The data to send.
UiFlow2 Code Block:

MicroPython Code Block:
client.sendall(b"Hello")
- close(*args, **kwargs)
Close the connection.
UiFlow2 Code Block:

MicroPython Code Block:
client.close()
- getsockname(*args, **kwargs)
Return the socket’s own address.
- Returns:
The socket’s own address. the format is (host, port).
- Return type:
UiFlow2 Code Block:

MicroPython Code Block:
# get local ip address client_socket.getsockname()[0]

