import socket
import threading
import time
HOST = '127.0.0.1' PORT = 8080
clients = []
server_start_time = time.time()
status_message_counter = 0
lock = threading.Lock()
def handle_client(client_socket, client_address):
print(f"[+] New connection from {client_address}")
with lock:
clients.append(client_socket)
try:
buffer = "" while True:
data = client_socket.recv(1024)
if not data:
print(f"[-] Connection closed by {client_address}")
break
buffer += data.decode('utf-8')
print(f"[{client_address}] Received {len(data)} bytes, buffer is now: {repr(buffer)}")
while "\n" in buffer or "\r" in buffer:
if "\r\n" in buffer:
line, buffer = buffer.split("\r\n", 1)
elif "\n" in buffer:
line, buffer = buffer.split("\n", 1)
else: line, buffer = buffer.split("\r", 1)
line = line.strip()
print(f"[{client_address}] Received line: {repr(line)}")
if line.lower() == "hello":
response = "Hi there!"
else:
response = "Please say hello"
client_socket.sendall(f"{response}\n".encode('utf-8'))
except ConnectionResetError:
print(f"[-] Connection reset by {client_address}")
except Exception as e:
print(f"[!] Error with {client_address}: {e}")
finally:
with lock:
clients.remove(client_socket)
client_socket.close()
print(f"[-] Connection closed with {client_address}")
def send_status_messages():
global status_message_counter
while True:
time.sleep(100) elapsed_time = int((time.time() - server_start_time) * 1000)
status_message_counter += 1
status_message = f"I ({elapsed_time}): TestServer: Status message {status_message_counter}\n"
with lock:
for client_socket in clients:
try:
client_socket.sendall(status_message.encode('utf-8'))
except Exception as e:
print(f"[!] Error sending status message: {e}")
def start_server():
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((HOST, PORT))
server.listen(5) server.settimeout(1.0) print(f"[*] Server listening on {HOST}:{PORT}")
threading.Thread(target=send_status_messages, daemon=True).start()
try:
while True:
try:
client_socket, client_address = server.accept()
print(f"[+] Accepted connection from {client_address}")
client_thread = threading.Thread(
target=handle_client, args=(client_socket, client_address), daemon=True
)
client_thread.start()
except socket.timeout:
pass
except KeyboardInterrupt:
print("\n[!] Server shutting down...")
finally:
server.close()
if __name__ == "__main__":
start_server()