Проблема в том, что ваш серверный цикл принимает только одну команду, а затем возвращается к accept
совершенно новому соединению и никогда не смотрит на старое соединение.
Ваш вывод вводит в заблуждение, потому что он выводит Waiting for a command...
. Но это происходит только потому, что у вас есть дополнительные print("\nWaiting for a command...")
до send_msg
, а у вас нет вывода до sock.accept
. Вы можете видеть, что на самом деле происходит, если вы делаете свои отпечатки точными. Например:
sock.listen(1)
while True:
print('Waiting for a connection...') # inside the loop, not before it
conn, caddr = sock.accept()
# ... etc. ...
print("Sending reply...")
# Don't print Waiting for a command here, because you aren't
send_msg(msg)
# And print something after the send succeeds
print("Sent")
print()
Итак, теперь вы знаете, что не так, как вы можете это исправить?
Simple. Нам просто нужен вложенный цикл. Как только вы accept
подключитесь к клиенту, продолжайте использовать это подключение до тех пор, пока оно не выйдет:
sock.listen(1)
while True:
print('Waiting for a connection...') # inside the loop, not before it
conn, caddr = sock.accept()
print("Connected!\n")
while True:
print("Waiting for a command...")
data = get_msg()
#Exit
if data == "exit":
print("\nConnection closed")
conn.close()
break # go back to the outer accept loop to get the next connection
print("Received '" + data + "'")
# ... etc. ...
print()