Расточительно на каждый запрос создавать поток, используйте асинхронность.
Архитектура примерно такая:
1. определить биндинги к ip
2. в цикле создать слушатель на каждый ip (или привязаться к 0.0.0.0)
3. для каждого слушателя создать массив буферов ввода
4. при подключении добавить соединение в буфер
5. читать данные и что то с ними делать
Посмотрите вот этот пример, в Jave есть обертки, но суть в общем то одна
https://www.ibm.com/support/knowledgecenter/ssw_ib...