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:

cores3_simple_client_example.png

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: object

Create an EasyTCPClient object.

Parameters:
  • remote_host (str) – The remote host address.

  • remote_port (int) – The remote port number.

  • timeout (int) – The timeout in seconds. Default is 10.

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:

init.png

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:

connect.png

MicroPython Code Block:

client.connect()
on_connect(callback)

Set the callback function for connection event.

Parameters:

callback – The callback function.

UiFlow2 Code Block:

on_connect.png

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:

on_data_received.png

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:

on_disconnect.png

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:

check_event.png

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:

send.png

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:

sendall.png

MicroPython Code Block:

client.sendall(b"Hello")
close(*args, **kwargs)

Close the connection.

UiFlow2 Code Block:

close.png

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:

tuple

UiFlow2 Code Block:

getsockname.png

MicroPython Code Block:

# get local ip address
client_socket.getsockname()[0]
getpeername(*args, **kwargs)

Return the remote address to which the socket is connected.

Returns:

The remote address. the format is (host, port).

Return type:

tuple

UiFlow2 Code Block:

getpeername.png

MicroPython Code Block:

# get remote ip address
client_socket.getpeername()[0]