Basic TCP Socket Communication in Python with Multi-Client Support

Simple TCP Server and Client

A minimal TCP server that listens for a single client connection:

import socket

def run_server():
    host = '0.0.0.0'
    port = 5001
    server_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server_sock.bind((host, port))
    server_sock.listen(1)
    print("Listening...")

    while True:
        client_conn, client_addr = server_sock.accept()
        print('Connected by', client_addr)
        client_conn.send(b"Connected successfully")
        try:
            while True:
                msg = client_conn.recv(1024).decode('utf-8')
                if not msg:
                    break
                print(msg)
        finally:
            client_conn.close()

if __name__ == "__main__":
    run_server()

Corresponding client implementation:

import socket

def run_client():
    host = '127.0.0.1'
    port = 5001
    client_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client_sock.connect((host, port))
    
    welcome_msg = client_sock.recv(1024)
    print(welcome_msg.decode())

    try:
        while True:
            user_input = input("Enter message: ")
            client_sock.send(user_input.encode('utf-8'))
    except KeyboardInterrupt:
        pass
    finally:
        client_sock.close()

if __name__ == "__main__":
    run_client()

Multi-Client TCP Server Using Threading

To support multiple concurrent cliants, use ThreadingTCPServer from the socketserver module:

from socketserver import BaseRequestHandler, ThreadingTCPServer

class EchoHandler(BaseRequestHandler):
    def handle(self):
        client_ip, _ = self.client_address
        print(f'{client_ip} connected!')
        try:
            while True:
                data = self.request.recv(1024)
                if not data:
                    break
                msg = data.decode('utf-8')
                print(f'Received: {msg}')
                self.request.sendall(b'response')
        finally:
            print("Connection closed.")

if __name__ == '__main__':
    server = ThreadingTCPServer(('127.0.0.1', 8998), EchoHandler)
    print("Server listening on port 8998...")
    server.serve_forever()

Enhanced client compatible with the thraeded server:

import socket

class TcpClient:
    def __init__(self, host='127.0.0.1', port=8998):
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.sock.connect((host, port))

    def interact(self):
        try:
            while True:
                msg = input("Message to send: ")
                self.sock.sendall(msg.encode())
                reply = self.sock.recv(1024).decode()
                print(f"Reply: {reply}")
        except KeyboardInterrupt:
            pass
        finally:
            self.sock.close()

if __name__ == "__main__":
    client = TcpClient()
    client.interact()

Tags: python socket tcp networking multithreading

Posted on Thu, 07 May 2026 17:47:13 +0000 by jtymes