Я бы использовал асинхронные методы как на сервере, так и на клиенте.Это усложнит вещи, особенно у клиента.
Причина в том, что вы пишете, что сервер иногда отправляет данные клиенту.Это делает невозможным простой тип запроса / ответа (клиент вызывает Send
, а затем использует Receive
, пока не будет получен правильный ответ).
Если вы можете отменить это требование, я бы использовал синхронных клиентов(вместо этого сделайте опрос), что значительно облегчит вам понимание.
Если у вас есть .Net 3.5, почему бы вам не создать службу WCF?Он поддерживает TCP и обратные вызовы (сервер может вызывать вещи в клиенте).