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