Henry Hoang

Appendix_Socket_server_sample

Appendix_Socket_server_sample

Highlight:

  • Create a server that expose server_socket listen on a specified port (5555 in my case)
  • The server_port is register in selector object which can be viewed as book keeping
  • Keep a loop to monitor all of events comming in server and check with the selector object. 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

  • 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)

On this page