Я думаю, что вы перепутали свои отступы кода после их копирования. Например, display_receipt (), кажется, не имеет тела, как сейчас. Пожалуйста исправьте. Кроме того, строка «if menu == 1:» кажется неуместной.
Предположим, ваш отступ хорош. Ошибка, показанная выше, связана с тем, что totalp был назначен вне области действия функции, на которую он ссылается. Так что используйте (и, если вам нужно, прочитайте о) ключевое слово «global». По сути, если вы измените свою функцию choose_menu () так, чтобы она была похожа на
def choose_menu():
global totalp
print("")
# code continues as shown above
, вы получите желаемое поведение. Вам, вероятно, придется сделать то же самое для TotalT.
Стоит отметить, что использование глобальных переменных для тривиальных случаев обычно не лучший метод. Попробуйте передать значение, если можете, или используйте типы, которые позволяют ссылаться в таком случае (например, списки).
Почти все игры имеют потребность в быстро реагирующих свойствах (и до меньшей степени, свойств без установления соединения) UDP и надежности TCP. То, что они делают, они создают свой собственный надежный протокол сверху UDP. Это дает им способность просто разорвать пакеты к тому, везде, где и дополнительно делают их надежными, также.
надежная пакетная система обычно является простой retry-acknowledged системой, более простой, чем TCP, но существуют протоколы, которые идут путем вне того, что может предложить TCP.
Ваша ситуация звучит очень простой. Вы, вероятно, сможете сделать самое чистое решение сами - просто заставляют каждый клиент передать обратно, "Я слышал Вас" ответ, и имейте сервер, продолжают пробовать, пока это не получает его (или сдается).
, Если Вы хотите что-то больше, большинство библиотек пользовательского протокола находится в C++, таким образом, я не уверен, каким количеством использования они будут Вам. Однако моему знанию здесь несколько лет - возможно, некоторые протоколы были портированы к настоящему времени. Хм... RakNet и enet являются двумя библиотеками C/C++, которые приходят на ум.
Вы могли использовать Распространение , чтобы сделать коммуникацию группы.
Смотрите на sctp, который имеет комбинацию tcp и udp функций. Существует окна реализация доступный.
Вы могли реализовать свое собственное подобное TCP поведение на прикладном уровне.
Так, например, Вы отослали бы широковещательную передачу UDP, но затем ожидали бы ответ ответа от каждого хоста. Если Вы не получили ответ в течение X секунд, то отправьте другого и так далее до достижения своего рода порога. Если порог достигнут (т.е. хост не ответил вообще), то сообщите об ошибке.
, Чтобы сделать это, хотя, Вам был бы нужен предопределенный список хостов для ожидания ответов назад из.
Я думаю, что самой раздражающей функцией TCP в этих сценариях является способность/путь сортировки входящих пакетов к их первоначальному заказу - понятие потока. Вы не можете считать байт до байта, прежде чем он прибыл.
, Если можно жить без него, у Вас есть свой шанс иметь Ваш протокол, быстрый и надежный, но не для упорядочивания пакетов! Просто невозможно управлять ими обоими, потому что Вы не можете заказать свои байты, пока Вы не получаете другую копию потерянного пакета, это - основной компромисс.
Почему сборка что-то с нуля, если можно пользоваться библиотекой? Специально для такого маленького проекта?
использование Попытки Emcaster, который сам с помощью надежного многоадресного обмена сообщениями - PGM, записан в.NET и с полным источником. Вы получите хороший pub/sub механизм с темой, фильтрующей легко доступный. Или можно узнать из кода, как сделать это и основывать собственное расширение на нем.
То, что можно сделать, - то, что после широковещательной передачи имеют эти , клиенты инициируют соединения TCP. Иначе просто необходимо сохранить список всех клиентов и инициировать соединения с каждым клиентом сами.
Я думаю, что существует три опции, вообще говоря:
Вы могли бы хотеть изучить RFC 3208 "Спецификация Надежного транспортного протокола PGM".
Вот краткий обзор:
Прагматическая общая многоадресная передача (PGM) является надежным многоадресным транспортом
протокол для приложений, которые требуют заказанный или незаказанный,
без дубликатов, многоадресная доставка данных от многочисленных источников до
несколько получателей. PGM гарантирует, что получатель в группе или получает все пакеты данных от передач и восстановлений, или может обнаружить неисправимую потерю пакета данных. PGM конкретно предназначается как осуществимое решение для многоадресных приложений с основными требованиями надежности. Его центральной целью дизайна является простота операции с должным вниманием для масштабируемости и эффективности использования сети.
По сравнению с предыдущим годом должен смотреть на Норму (NACK-ориентированный на Надежную Многоадресную передачу) спецификация. Можно найти информация о Норме здесь .
протокол НОРМЫ разработан для обеспечения сквозной надежной передачи объемных объектов данных или потоков по универсальным службам маршрутизации многоадресного IP-пакета и услугам переадресации. НОРМА использует выборочное, отрицательное подтверждение (NACK) механизм для транспортной надежности и предлагает дополнительные механизмы протокола для проведения надежных сеансов многоадресной передачи с ограниченной "априорной" координацией среди отправителей и получателей
Это несколько очень хорошо известный в военном мире.
Широковещательная передача не то, что Вы хотите. С тех пор там мог и вероятно быть устройствами, присоединенными к этой сети, которые не заботятся о Вашем сообщении, необходимо использовать Многоадресную передачу. В отличие от широковещательных сообщений, которые должны быть отправлены в и обработаны каждым клиентом в сети, Многоадресные сообщения передаются только заинтересованным клиентам (т.е. те, которые имеют некоторое намерение получить этот конкретный тип сообщения и действовать на нее).
при позже увеличении масштаба этой системы так, чтобы она была направлена по большой сети, многоадресная передача может масштабироваться, к которому, тогда как широковещательно переданный не будет, таким образом, Вы получаете выгоду масштабируемости, которую Вы могли бы ценить позже. Между тем Вы устраняете ненужные издержки в переключателях и других устройствах, которые не должны видеть их, "что-то изменило" сообщения.
@epatel - я второй предложение SCTP (я голосовал, но еще не могу прокомментировать так дополнительный материал здесь).
SCTP имеет много замечательных особенностей и гибкости. Можно подразделить соединение на несколько потоков и выбрать надежность каждого и заказано ли это или нет. С другой стороны, с Частично Надежность расширение, можно управлять надежностью на на основание сообщения.
Создайте TCP-сервер. У каждого клиента подключиться. В вашем протоколе TCP с клиентами создайте каждый пакет с 2-байтовым префиксом общего размера следующего сообщения.
Клиенты, затем вызовут Читайте (max_size = 2)
на сокете, чтобы определить размер следующего сообщения, а затем Прочитайте (max_size = s)
, чтобы собрать сообщение.
Вы получаете надежные, заказанные сообщения, простые. Вам не нужны рамки обмена сообщениями для этого.
Можно использовать Message Broker, например, ActiveMQ.
Опубликуйте свои сообщения в теме и попросите клиентов зарегистрировать длительную подписку на эту тему, чтобы они не пропустили ни одного сообщения, даже если они не находятся в сети.
Apache ActiveMQ - это центральная система сообщений. написанный на Java вместе с полным Клиент JMS. Однако Apache ActiveMQ предназначенный для связи по номеру протоколов типа Stomp и OpenWire вместе с поддержкой количество различных языков клиенты.
Поддержка клиентской платформы включает в себя c# и .net
.