Программа обмена сообщениями не завершает работу(), когда ей сообщаютPython

Программы на Python
Anonymous
Программа обмена сообщениями не завершает работу(), когда ей сообщают

Сообщение Anonymous »

Я пытаюсь создать систему обмена сообщениями на Python, в которой два компьютера, на которых запущена одна и та же программа, могут обмениваться сообщениями друг с другом. Я выполнил это и добавил, что если я наберу «назад», программа выйдет из программы. Проблема в том, что команда «назад» работает только на стороне клиента, на стороне сервера она показывает, что было введено «назад», и печатает «выход», но не закрывает сервер, но все еще слушает клиентскую сторону, даже хотя он уже завершился.
Это мой код

Код: Выделить всё

import socket
import threading
import sys
import time

# Configuration
SERVER_HOST = 'localhost'  # Server IP address
SERVER_PORT = 12345        # Port to listen on / connect to
BUFFER_SIZE = 1024

clients = []  # List to keep track of connected clients
client_socket = None  # To keep track of the current client's socket
shutdown_flag = threading.Event()  # Event to signal shutdown

def handle_client(conn_socket):
global shutdown_flag
while not shutdown_flag.is_set():
try:
message = conn_socket.recv(BUFFER_SIZE).decode('utf-8')
if message:
if message.upper() == 'BACK':
print("Client requested shutdown.")
shutdown_flag.set()
broadcast("Server is shutting down.", conn_socket)
break
print(f"Received: {message}")
broadcast(message, conn_socket)
else:
break
except:
break
remove(conn_socket)
conn_socket.close()

def broadcast(message, sender_socket):
for client in clients:
if client != sender_socket:
try:
client.send(message.encode('utf-8'))
except:
remove(client)

def remove(socket_to_remove):
if socket_to_remove in clients:
clients.remove(socket_to_remove)

def start_server():
global shutdown_flag
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.bind((SERVER_HOST, SERVER_PORT))
server.listen(5)
print(f"Server started on {SERVER_HOST}:{SERVER_PORT}")

while not shutdown_flag.is_set():
try:
conn_socket, addr = server.accept()
clients.append(conn_socket)
print(f"Connection from {addr}")
threading.Thread(target=handle_client, args=(conn_socket,)).start()
except:
if shutdown_flag.is_set():
break

# Clean up server
server.close()
print("Server shut down.")

def receive_messages():
global client_socket, shutdown_flag
while not shutdown_flag.is_set():
try:
message = client_socket.recv(BUFFER_SIZE).decode('utf-8')
if message:
print(f"Message: {message}")
else:
break
except:
break
shutdown_flag.set()  # Signal shutdown to the server
client_socket.close()

def send_messages():
global client_socket, shutdown_flag
while not shutdown_flag.is_set():
message = input()
if message.upper() == 'BACK':
print("Exiting...")
shutdown_flag.set()
client_socket.close()
sys.exit()
client_socket.send(message.encode('utf-8'))

def start_client():
global client_socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect((SERVER_HOST, SERVER_PORT))

threading.Thread(target=receive_messages).start()
threading.Thread(target=send_messages).start()

def main():
global client_socket
try:
# Attempt to connect to the server
test_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
test_socket.connect((SERVER_HOST, SERVER_PORT))
test_socket.close()
print("Connected to the server. Running as client.")
start_client()
except (ConnectionRefusedError, socket.gaierror):
print("Server not found.  Starting server.")
server_thread = threading.Thread(target=start_server)
server_thread.start()
# Wait a moment for the server to start up
time.sleep(1)
start_client()

if __name__ == "__main__":
main()
Мне просто нужна помощь, чтобы выяснить, как заставить команду «назад» закрыть сервер, клиент и выйти из программы.
Это результат со стороны клиента, когда клиент вводит «назад»:
Изображение

Это вывод со стороны сервера, когда сервер вводит команду «back»:
Изображение

как видно здесь, программа не выходит из программы, и клиент все еще может отправлять сообщения:
Изображение


Подробнее здесь: https://stackoverflow.com/questions/787 ... -when-told

Вернуться в «Python»