To create a simple TCP server in Python, open a stream socket, bind it to an address and port, call listen(), then use accept() to get a separate socket for each client connection. The example below binds to IPv4 loopback, so it is intended for testing on the same computer—not for accepting connections from other devices.
How do I create a simple TCP server in Python?
Python’s built-in socket module provides the low-level pieces. This small echo server accepts connections one at a time and sends back the bytes each client sends:
As an Amazon Associate I earn from qualifying purchases.
import socket
HOST = "127.0.0.1" # IPv4 loopback: local connections only
PORT = 50007
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as server:
server.bind((HOST, PORT))
server.listen()
print(f"Listening on {HOST}:{PORT}")
while True:
conn, address = server.accept()
with conn:
print("Connected by", address)
while True:
data = conn.recv(1024)
if not data:
break
conn.sendall(data)
The server follows the sequence socket(), bind(), listen(), and accept(). The Python Software Foundation’s socket reference describes this as the server-side sequence, with accept() repeated as needed for further clients.
What’s actually slowing this PC down?
Pick the symptom - the matching free tool is one click away.
This is an educational echo server, not a general-purpose service. It handles one connection at a time: while it is receiving from a connected client, it does not accept another. It also assumes a simple byte-stream exchange rather than defining a complete application protocol.
#1 Best Overall
- Read Before You Buy — No Video Output: These adapters support charging and USB 2.0 data transfer, but cannot transmit video signals. Except for standard USB webcams (which use USB data only), they are not compatible with HDMI/DisplayPort cables, video-capable USB-C hubs, or docking stations with video output.
- Convert USB-A Ports to USB-C: Designed to connect USB-C earphones, cables, flash drives, card readers, and other USB-C accessories to standard USB-A ports. Plug-and-play with no drivers or software required.
- Aluminum Alloy Housing: Built with a sturdy aluminum alloy shell that aids in heat dissipation and protects against daily wear and scratches. Designed to maintain a stable and secure connection.
- Compact & Travel-Friendly: The ultra-compact design allows the adapter to stay plugged into your device without blocking adjacent ports or adding bulk, reducing wear and tear on your original USB ports.
- 12-Month Warranty: Backed by a 12-month manufacturer warranty for peace of mind. Designed to meet strict quality control standards for reliable everyday performance.
What do bind(), listen(), and accept() do?
- Create:
socket.socket(socket.AF_INET, socket.SOCK_STREAM)creates an IPv4 stream socket.SOCK_STREAMis the socket type used for TCP in the documented examples. - Bind:
bind((HOST, PORT))assigns the local address and port on which the server will wait. - Listen:
listen()marks the socket as ready to accept incoming connection requests. The optional backlog concerns requests queued before they are accepted; it is not a guarantee of how many clients the server can serve at once. If omitted, the operating system may choose a reasonable default. - Accept:
accept()waits for a connection and returns a pair: a new socket for that client and the client’s address.
Why does accept() return another socket?
The original socket remains the listening socket: it waits for new connections. The socket returned by accept() is the connection socket, and it is the one used for that client’s recv() and sendall() calls. Keeping those roles separate lets the server continue listening while a connection is handled—although this example does so serially.
How can I test a Python socket server locally?
Save the server as server.py, run it with Python, and leave it running. In another terminal, run this client:
Rank #2
- 5-in-1 USB-C Hub: Experience comprehensive connectivity featuring a Power Delivery input, two USB-A 2.0 ports, a USB-A 3.0 port, and an HDMI port. (Note: The USB-C power delivery input port is only for connecting an external wall charger to power your laptop and cannot power peripheral devices.)
- 90W Pass-Through Charging: Achieve optimal charging with 90W pass-through power to your laptop, supported by a total input of 100W, with the hub reserving 10W for operational efficiency. (Note: Wall charger not included.)
- Quick Data Transfers: Accelerate your productivity with rapid data transfers using a high-speed 5Gbps USB 3.0 port and two 480Mbps USB 2.0 ports.
- 4K HDMI Display: Enhance your visual experience with a hub capable of delivering 4K resolution at 30Hz in both mirror and extend modes. Please note that this hub is compatible with MacBook (macOS 12 and newer), Windows 10 and 11, ChromeOS, and laptops equipped with DP Alt Mode and Power Delivery. Note: This device is not compatible with Linux.
- What You Get: Anker USB-C Hub (5-in-1, 4K HDMI), welcome guide, 18-month warranty, and our friendly customer service.
import socket
HOST = "127.0.0.1"
PORT = 50007
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as client:
client.connect((HOST, PORT))
client.sendall(b"hellon")
print(client.recv(1024))
The client should print the bytes it sent, and the server should print the connecting peer’s address. This simple exchange works because the server echoes received bytes. Both programs use the same loopback address and port; a mismatch prevents the client from reaching the server.
Which address should the server bind to?
| Host value | Reachability and use |
|---|---|
127.0.0.1 |
IPv4 loopback. A client on the same machine can connect; other devices cannot use this address to reach the server. |
"" (empty string) |
In the documented example, binds to all available interfaces. Other devices may be able to reach the service through an address on the machine, subject to firewall and network configuration. |
For a local exercise, loopback limits exposure. Binding to all interfaces is a deliberate reachability change, not just a different spelling of localhost. The Python Socket Programming HOWTO explains that localhost binding is visible only on the same machine, while an empty host makes the socket reachable through the machine’s addresses.
Rank #3
- Sleek 7-in-1 USB-C Hub: Features an HDMI port, two USB-A 3.0 ports, and a USB-C data port, each providing 5Gbps transfer speeds. It also includes a USB-C PD input port for charging up to 100W and dual SD and TF card slots, all in a compact design.
- Flawless 4K@60Hz Video with HDMI: Delivers exceptional clarity and smoothness with its 4K@60Hz HDMI port, making it ideal for high-definition presentations and entertainment. (Note: Only the HDMI port supports video projection; the USB-C port is for data transfer only.)
- Double Up on Efficiency: The two USB-A 3.0 ports and a USB-C port support a fast 5Gbps data rate, significantly boosting your transfer speeds and improving productivity.
- Fast and Reliable 85W Charging: Offers high-capacity, speedy charging for laptops up to 85W, so you spend less time tethered to an outlet and more time being productive.
- What You Get: Anker USB-C Hub (7-in-1), welcome guide, 18-month warranty, and our friendly customer service.
What does recv(1024) actually read?
recv(1024) requests up to 1,024 bytes; it does not promise to return exactly that many bytes or one complete application message. TCP delivers a stream of bytes and does not preserve the boundaries between separate sends. The loop echoes each chunk it receives until recv() returns an empty byte string, which indicates that the peer has closed its sending side.
For an actual protocol, define how the receiver recognizes message boundaries. Common approaches include fixed-size messages, a delimiter, or a length prefix. Also define text encoding explicitly if the protocol carries text; the example uses bytes and makes no encoding assumption. Use sendall() when the intention is to send all bytes in a given byte string.
Rank #4
- Dual Converters, Infinite Potential:Includes 2× USB C male to USB A female adapters and 2× USB A male to USB C female adapters. Perfect for a wide range of uses—tablets with Bluetooth keyboards, expand USB ports on macbook, and more. Two different converters for all your daily needs
- Next-Level 10Gbps & 3A Charging: No more slow 480Mbps, this usb to usb c adapter has a transfer speed of up to 10Gbps, allowing you to do more transferring in less time. This usb adapter fits both USB A and USB C charger, supporting up to 3A fast charging
- Upgraded Exquisite Craftsmanship: With an aluminum alloy housing and metal connector, the usbc to usb adapter is extremely durable and sturdy. Rigorously tested to withstand more than 10,000 times of plugging and unplugging, ensuring long-lasting performance
- Broad Compatible: The usb c to usb adapter widely supports all USB C/ USB A devices like laptops, tablets, cellphones, car chargers, and phone chargers. Such as compatible with MacBook Pro/Air 2023/2022, Thunderbolt 4/3 Devices,Apple MagSafe Watch 9/8/7/SE/Ultra, iPad Pro 2022/2021, Samsung Galaxy S23/S20/S10, and iPhone 17/16/15 Pro. Plug and play
- Please Note: To reach 10Gbps speed, keep the cable under 3.3 ft. For USB A Male to USB C adapters, try flipping the USB C connector. USB C Male to USB A adapters support bidirectional 10Gbps transfer within 3.3 ft
How do I make a Python server handle more than one client?
The repeated accept() loop in the example serves successive clients, but serially. It waits for a client to finish before accepting another. To handle overlapping connections, a server needs a concurrency strategy, such as worker threads, processes, or asynchronous I/O; each accepted connection still has its own connection socket. The right choice depends on the workload and protocol, and the minimal example does not implement one.
Windows Errors? Fix Them Before They Spread
Repair common Windows errors and clear accumulated junk for a smoother, more stable PC - no reinstall needed.Free scan · no reinstallOutdated Drivers Are Slowing You Down
One free scan finds every outdated or missing driver and matches the right update for your exact hardware.Free scan · exact hardware matchWhat changes with IPv6 or a higher-level server API?
The example explicitly creates an IPv4 socket with AF_INET. IPv6 requires appropriate address-family handling, and whether a socket accepts both IPv4 and IPv6 traffic depends on platform configuration. The Python reference demonstrates using getaddrinfo() to work with available address families and cautions that selecting only the first result can leave the other family unsupported.
Best Value
- 5-in-1 Connectivity: Equipped with a 4K HDMI port, a 5 Gbps USB-C data port, two 5 Gbps USB-A ports, and a USB C 100W PD-IN port. Note: The USB C 100W PD-IN port supports only charging and does not support data transfer devices such as headphones or speakers.
- Powerful Pass-Through Charging: Supports up to 85W pass-through charging so you can power up your laptop while you use the hub. Note: Pass-through charging requires a charger (not included). Note: To achieve full power for iPad, we recommend using a 45W wall charger.
- Transfer Files in Seconds: Move files to and from your laptop at speeds of up to 5 Gbps via the USB-C and USB-A data ports. Note: The USB C 5Gbps Data port does not support video output.
- HD Display: Connect to the HDMI port to stream or mirror content to an external monitor in resolutions of up to 4K@30Hz. Note: The USB-C ports do not support video output.
- What You Get: Anker 332 USB-C Hub (5-in-1), welcome guide, our worry-free 18-month warranty, and friendly customer service.
Python also provides socket.create_server(), available since Python 3.8, as a convenience for creating a server socket. Its optional dualstack_ipv6 behavior is platform-dependent, so do not assume an IPv6 bind has identical dual-stack behavior on every system. For HTTP applications, a higher-level HTTP server or framework is generally a better fit than implementing the protocol directly with raw TCP sockets; the socket API is useful for learning TCP mechanics or building a custom protocol.
How are the sockets closed?
The outer with block closes the listening socket when execution leaves it, and the inner with conn closes each accepted connection socket when that client’s loop ends. Context managers make cleanup explicit even when an error interrupts normal handling. In a more robust program, handle expected OSError cases—for example, when the requested port cannot be used—and decide whether to retry, report the failure, or exit.
Quick Recap
Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.
Recommended Free Tools




