Я бы пошел на постоянный двунаправленный канал между сервером и клиентом.
Если все, что у вас будет, это один сервер и один клиент, тогда проблем с коллизиями нет ... Если сервер принимает соединение, он знает, что это клиент и вице наоборот. Оба могут читать и писать в одном сокете.
Теперь, если у вас есть несколько клиентов, и ваш сервер должен отправить запрос конкретно клиенту X, тогда вам нужно рукопожатие !
Когда клиент загружается, он подключается к серверу. Как только это соединение установлено, клиент идентифицирует себя как клиент X (сообщение квитирования). Теперь сервер знает, что у него есть сокет, открытый для клиента X, и каждый раз, когда ему нужно отправить сообщение клиенту X, он снова использует этот сокет.
К счастью, я только что написал учебник (включая пример проекта) по этой конкретной проблеме. Используя Netty! :)
Вот ссылка: http://bruno.linker45.eu/2010/07/15/handshaking-tutorial-with-netty/
Обратите внимание, что в этом решении сервер не пытается подключиться к клиенту. Это всегда клиент, который подключается к серверу.
Если вы думали об открытии сокета каждый раз, когда хотели отправить сообщение, вам следует пересмотреть постоянные соединения, поскольку они позволяют избежать накладных расходов на установление соединения и, следовательно, увеличить скорость передачи данных в N раз.