socket communication

Introduction to Sockets

socket is the program interface for TCP or UDP communication. TCP establishes a connection and preserves delivery order. UDP has less overhead but packets may be lost or arrive out of order.

MaixPy can use Python's built-in socket library directly. See the Python socket documentation for all parameters.

Here, we introduce simple usage methods. With these example codes, you can perform basic TCP and UDP communication on MaixPy MaixCAM. Remember to modify the IP address and port number according to your actual situation.

Socket TCP Client

This example requests a TCP server, sends a message, waits for a response, and then closes the connection.

import socket

def tcp_client(ip, port):
    client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_address = (ip, port)
    client_socket.connect(server_address)

    try:
        # Send data to the server
        message = 'Hello, Server!'
        print("Send:", message)
        client_socket.sendall(message.encode('utf-8'))

        # Receive the server's response
        data = client_socket.recv(1024)
        print('Received:', data.decode('utf-8'))
    finally:
        # Close the connection
        client_socket.close()

if __name__ == "__main__":
    tcp_client("10.228.104.1", 8080)

Socket TCP Server

This example creates a socket server that continuously waits for client connections. Once a client connects, a thread is created to communicate with the client, reading the client's message and echoing it back.

import socket
import threading

local_ip = "0.0.0.0"
local_port = 8080

def receiveThread(conn, addr):
    while True:
        print('Reading...')
        client_data = conn.recv(1024)
        if not client_data:
            break
        print(client_data)
        conn.sendall(client_data)
    print(f"Client {addr} disconnected")

ip_port = (local_ip, local_port)
sk = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sk.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sk.bind(ip_port)
sk.listen(50)

print("Waiting for clients...")
while True:
    conn, addr = sk.accept()
    print(f"Client {addr} connected")
    # Create a new thread to communicate with this client
    t = threading.Thread(target=receiveThread, args=(conn, addr))
    t.daemon = True
    t.start()

Socket UDP Client

import socket

def udp_send(ip, port):
    # Create a socket object
    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

    # Define the server's IP address and port number
    server_address = (ip, port)

    try:
        # Send data to the server
        message = 'Hello, Server!'
        udp_socket.sendto(message.encode('utf-8'), server_address)
    finally:
        # Close the connection
        udp_socket.close()

# Call the function
udp_send("10.228.104.1", 8080)

Socket UDP Server

import socket

def udp_receive(ip, port):
    # Create a socket object
    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

    # Define the server's IP address and port number
    server_address = (ip, port)

    # Bind the port
    udp_socket.bind(server_address)

    print('Waiting for a message...')

    while True:
        data, address = udp_socket.recvfrom(1024)
        print('Received:', data.decode('utf-8'))
        print('From:', address)

    # Close the connection
    udp_socket.close()

# Call the function
udp_receive('0.0.0.0', 8080)