На сервере должно быть 2 цикла.
Перед accept() тоже должен быть бесконечный цикл, чтобы принимать нового клиента после того, как разобрались со старым.
conn.close() - это завершение не сервера, а клиента ("разобрались со старым").
И вообще-то каждого из них лучше запускать в своем потоке, чтобы они не ждали друг друга. Хотя, это спорный вопрос. Кто-то скажет, что бред. Но если клиентов всего 30, то уж точно жалеть потоков нет смысла.
Но пока это хелловорлд - эта проблема вообще не актуальна.
Но у вас еще столько впереди.
Полноценный код надежного (не вылетающего на первом обрыве) TCP-клиент-сервера раз в 5 длиннее.