Appendix_Socket_server_sample
Appendix_Socket_server_sample
Highlight:
- Create a server that expose
server_socketlisten on a specified port (5555in my case) - The
server_portis register inselectorobject which can be viewed as book keeping - Keep a loop to monitor all of events comming in server and check with the
selectorobject. If the event matching with listening then process:- Accept connection: In first time client connect. This actually register client socket
- Handle connection (after finishing acceptance): From client socket which already register in
selector, we can:- read data from socket
sock.recv - send data from socket
sock.sendall
- read data from socket

- For testing:
-
Run this code in server:
python this-code.py -
From client (for example in the same machine):
- In MacOS
nc 127.0.0.1 5555- In Windows
telnet 127.0.0.1 5555
-
import selectors
import socket
sel = selectors.DefaultSelector()
# --- Step 1: Create listening socket ---
server_sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_sock.bind(("0.0.0.0", 5555))
server_sock.listen()
server_sock.setblocking(False)
# Register the server socket for "read" events (incoming connections)
sel.register(server_sock, selectors.EVENT_READ)
def accept_connection(sock):
client_sock, addr = sock.accept() # non-blocking accept
print(f"Accepted connection from {addr}")
client_sock.setblocking(False)
# Register client for read events
sel.register(client_sock, selectors.EVENT_READ)
def handle_client(sock):
data = sock.recv(1024)
if data:
print("Received:", data.decode())
sock.sendall(b"Message received\n")
else:
print("Client disconnected")
sel.unregister(sock)
sock.close()
print("Server listening on port 5555...")
# --- Step 2: Main event loop ---
while True:
events = sel.select() # waits until some socket is ready
for key, mask in events:
sock = key.fileobj
if sock is server_sock:
accept_connection(sock)
else:
handle_client(sock)