Типичный многопоточный серверный код будет выглядеть примерно так (в псевдокоде, потому что я не знаю достаточно деталей Java, чтобы написать его точно, и потому что C немного душно):
socket s = new socket
bind s to an optional IP, port
listen s
while true
cli = accept s
t = new thread(handle_client, cli)
maybe disown thread, so no need to join it later
t.start
Важным моментом является то, что при создании сокета, привязке его к адресу и listen
все обрабатываются вне цикла , а accept()
и начальные потоки внутри цикла.
Возможно, вы захотите обернуть весь этот блок в другой поток;это приемлемо.Важной частью является отделение listen
от accept
и для каждого клиента thread
.Это позволяет вашему коду перестать принимать новые подключения, но обрабатывать существующих клиентов до тех пор, пока они не отключатся, или отключить существующие подключения, когда они используют выделенные им ресурсы, но продолжают принимать подключения и т. Д. (Обратите внимание, как ваш последний блок catch
завершит работу сервера, если таковой имеется).один клиентский сокет вызывает исключение, такого кода легко избежать при обычной компоновке сервера.)