Важно, чтобы при отправке нежелательных данных и данных ответов по одному и тому же соединению не перекрывались исходящие сообщения, иначе вы испортите свой протокол. Лучше всего, чтобы только 1 поток выполнял всю отправку, чтобы одно сообщение было отправлено полностью перед отправкой другого сообщения. Просто убедитесь, что вы разработали свой протокол, чтобы разрешить отправку незапрошенных данных после того, как клиент отправит команду и до того, как он получит ответ. Каждое сообщение должно описывать, что это за сообщение, таким образом, чтобы клиент мог обнаружить ответ и сопоставить его с более ранней командой при обработке незапрошенных данных как есть.
Существует несколько различных способов обработки отправки:
использовать отдельные темы для чтения и отправки. Например, поток OnExecute
обрабатывает все чтение и использует другой рабочий поток для обработки всей отправки. Если OnExecute
получает входящую команду, которая должна отправить ответ, передайте данные ответа в поток отправки (потокобезопасным способом), чтобы он мог отправлять ответ, когда это безопасно, между нежелательными сообщениями.
имеет поток обработки потока OnExecute
для чтения и отправки. При необходимости непрерывно отправляйте исходящие незапрошенные данные и периодически проверяйте входящие данные, используя методы IOHandler.InputBufferIsEmpty()
и IOHandler.CheckForSourceOnData()
, чтобы определить, когда необходимо прочитать входящее сообщение.
в противном случае, как предложил Джерри Додж в комментариях, просто используйте отдельные соединения, одно для данных командного ответа и одно для незапрошенных данных.