Twisted - успешный (или неудачный) обратный вызов для LineReceiver sendLine

Я все еще пытаюсь освоить Twisted, находясь в процессе завершения приложения, которое его использует.

Мой вопрос:

Мое приложение использует LineReceiver.sendLine для отправки сообщений с сервера Twisted TCP. Я хотел бы знать, удалось ли sendLine.

Я понял, что мне нужно каким-то образом добавить успешный (и ошибку?) Обратный вызов в sendLine, но я не знаю, как это сделать.

Спасибо за любые указатели / примеры

1 ответ

Решение

Вы должны определить "успешно", чтобы придумать ответ на этот вопрос.

Все sendLine немедленно (вероятно) добавляет несколько байтов в буфер отправки. В некотором смысле, до тех пор, пока это не вызовет исключения (например, MemoryError потому что ваша линия слишком длинная или TypeError потому что ваша линия была номером 3 вместо реальной строки) это удалось.

Это не очень полезный вид успеха. К сожалению, полезный вид успеха больше похож на то, что "байты были добавлены в буфер отправки, буфер отправки был сброшен в сокет, узел получил байты, и принимающее приложение постоянно действовало на данные".

Ничего в LineReceiver могу сказать вам, что все эти вещи произошли. Стандартное решение заключается в добавлении некоторого подтверждения в ваш протокол: когда принимающее приложение воздействует на данные, оно отправляет обратно несколько байтов, которые сообщают исходному отправителю, что сообщение было обработано.

Вы не получите LineReceiver.sendLine чтобы помочь вам много здесь, потому что все, что он действительно знает, как это сделать, это отправить несколько байтов в определенном формате. Вам нужен более сложный протокол для обработки подтверждений.

К счастью, Twisted поставляется с несколькими. twisted.protocols.amp один: он предлагает удаленные вызовы методов (в комплекте с ответами) в качестве основной функции. Я считаю, что AMP подходит для широкого спектра применений, поэтому его часто можно рекомендовать для новых разработок. Это в значительной степени заменяет старшее twisted.spread (также называемый "PB"), который также предоставляет как удаленные вызовы методов, так и ссылки на удаленные объекты (и поэтому является более сложным - по моему опыту, более сложным, чем требуется большинству приложений). Есть также некоторые опции, которые немного более стандартны: например, Twisted Web включает в себя реализацию HTTP (HTTP, как вы, возможно, знаете, хорош во взаимодействии стиля запрос / ответ).

Другие вопросы по тегам