В последний месяц нередки были случаи внезапного отключения в середине разговора. И вроде диалог шел хорошо, и рассказ интересный, а тут вдруг “Ваш собеседник прервал беседу”.
На самом деле это не каждый второй собеседник редиска, а несовершенство имеющихся в распоряжении технологий. До определенного момента разговор обрывался лишь тогда, когда любой из собеседников нажимал на кнопку “отключиться” и никак не раньше. Диалог мог длиться сутками без угрозы разрыва. Все бы так хорошо, если бы не пользователи браузера Opera, который не умеет сообщать серверу момент закрытия своего окна. Таким образом, если ваш собеседник пользуется Opera и в конце диалога нажимает на красный крестик в углу экрана, а не на кнопку “отключиться”, то вы ни за что не узнаете что он оборвал диалог и будете посылать в тишину фразы вроде “ты уснул?”, “отшел, да?”.
Проблему решили следующим образом. Установили таймер, который отсчитывает по 10 секунд и шлет пустое сообщение (ping) на сервер, таким образом на сервере всегда известно, что собеседники на связи. Если от одного из собеседников в течение полуминуты не приходит ни одного пинга (а должны быть три штуки (30/10)), то второму отправляется сообщение о том, что первый завершил диалог.
К сожалению, при таком раскладе мы не учли некоторых российских реалий. На практике соединение с интернетом очень нестабильно, даже на широкополосном доступе, и пинги, которым необходимо ходить каждые 10 секунд, порой, приходят через минуту. Таким образом и получались фиктивные разрывы связи.
Вот и выходит, что либо разговор бесконечный, но с неизвестным фактом окончания диалога, либо фиктивные разрывы со стороны собеседника. На текущий момент решили вернуться к первому варианту, поэтому, пользователи Оперы, уж не обессудьте, решения для вас мы еще не нашли.