Мне поручено работать с устаревшим приложением D6, которое использует TClientSocket для запроса данных с сервера TCP/IP, который возвращает XML, для чего мне необходимо интегрироваться с новым сторонним сервером, и у меня возникает прерывистая проблема с получением полные данные, отправленные в ответ сервера. Когда это произойдет, я получаю XML-строку над несколькими событиями OnRead, несмотря на то, что XML довольно маленький, около 1,76 КБ.Как получить данные сокетов из нескольких чтений?
Структура ответа является то, что первые четыре байта возвращающие указывают:
Byte Позиция, тип/назначение:
0 - 0x02 (STX)
1 - Length, LSB
2 - Length
3 - Length, MSB
Bytes 4+ are the xml payload
Однако программист до меня просто использовали Socket.ReceiveText, потому что все ответ, полученный для существующей логики, был очень мал, а в большинстве случаев - менее 200 байт ... по существу, подтверждение успеха или данные об ошибках.
Может, кто-то умнит меня, чтобы я понял, как я могу успешно использовать ответ, учитывая, что я получаю его в кусках? Я не использовал TClientSocket/TServerSocket, даже когда я регулярно использовал Delphi, и я не могу изменить то, с чем я больше знаком.
Заранее спасибо.
Remy! Теперь это имя, которого я не видел во многих лунах. Спасибо за ответ и понимание. Быстрый вопрос: как провести различие между одним или несколькими событиями чтения, связанными с ответом одного сервера от другого, учитывая асинхронный характер? Например, где вы указываете в своем примере, где должен обрабатываться xml, что нужно делать там, чтобы на следующем прочитанном событии я знал бы, что это для совершенно нового отдельного ответа/ответа? Благодаря! – LeeboJenkowitz
Обычно вы не используете такую асинхронную модель чтения для системы команд/ответов, если сами ответы не асинхронны (одновременно могут выполняться несколько команд, и ответы могут поступать в любом порядке), или сервер может отправлять незапрашиваемые сообщения между запрошенными ответами. В таких случаях ответы обычно содержат информацию, чтобы связать их с исходной командой. Если нет, вы можете, по крайней мере, сохранить заполненные XML-сообщения в списке FIFO, и выпустить выпадающий список команд из любых XML-сообщений, которые он ожидает в качестве ответа. –
Спасибо за продолжение. Я считаю, что сейчас у меня хорошее понимание. – LeeboJenkowitz