Что нового

Строение IM мессенджеров

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Задался я значит вопросом, как изнутри выглядит любой клиент например тот же ICQ, некоторые мессенджеры работают по принципу p2p (peer-to-peer) в дальнейшем просто p2p, если кто не знает, то p2p - это одноранговая сеть, программа построенная на её основе имеет в себе как клиент так и сервер, пример тому µTorrent или Skype, подробнее можно ознакомится на Wikipedia или Google, но суть не в этом, меня интересует как построен мессенджер, для примера возьмём всем нам известный Skype, и так, весь перечень интересующих меня (и не только) вопросов:

1. Для работы необходимо написать сервер который будет руководить парадом, для начала необходимо чтобы сервер был не ограничен в числе клиентов, как лучше вести учёт подключенных, отключенных и в случае подключения/отключения передавать клиенту новую информацию, допустим есть 3 клиента у которых в списке контактов ещё по 3 клиента, у 1-го (A) все 3 онлайн, у 2-го (B) 2 онлайн и у 3-го (C) 1 онлайн, спустя какое - то время произошёл Connect к серверу нового клиента и этот клиент есть в списке контактов клиента (B) и в тоже время Disconnect клиента из списка контактов (A), необходимо передать пакет клиенту (B) и (A) с актуальные на данный момент данными.

2. Так как у нас будет одноранговая сеть (p2p), то при написании текстовых сообщений нам не понадобится сервер из 1-го вопроса, но опять же так как в самой копии клиента имеется свой сервер, то он будет работать на приём от других клиентов в списке контактов, допустим что у нас уже решён вопрос с глобальным сервером из вопроса 1 и у нас уже есть видео-звонки, общаемся мы значит с человеком через видео-звонок, его сервер и мой сервер принимают пакеты с новыми порциями данных, что если нам напишет текстовое сообщение другой клиент из списка контактов, либо позвонит, сервер занят и получит новый пакет только тогда когда будет хоть малейший промежуток, от этого пойдут задержки... как решить такую задачу?!

3. Данный вопрос продолжение второго, и так, решили мы значит и 2-ой вопрос и пришло время реализовать видео-звонки, пусть есть я (A) и есть клиент из списка контактов (B), общаемся мы значит по видео-звонку, мне нужно передать ему допустим ссылку на сайт, не буду же я ему её диктовать или объяснять на пальцах, для этого нам понадобятся текстовые сообщения, как не прерывая видео-звонок отправит сообщение от (A) до (B) или наоборот без задержек.

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

Допустим работает сервер, к нему поступает запрос с авторизацией от клиента, если авторизация прошла успешно то, проверяем его список контактов и на каждый контакт из списка открываем индивидуальный поток? Был я и в Google и даже в Yandex, стоящей информации не нашёл, либо не так искал, по этому, если кто имел уже с этим опыт, поделитесь... Хотелось бы написать свой IM мессенжер, пусть не такой популярный как Skype, Mail.ru Агент или ICQ, но всё же мой, да и остальным участникам форума думаю будет интересно узнать :smile:

P.S. если что-то не так понял или написал, прошу поправить.
 

Black_Hole

Знающий
Сообщения
126
Репутация
11
p2p не лучший протокол для IM, xmpp получше будет, поддерживает социалки, ботов, автоответчики, онлайн-переводчики, плагины, кучу всяких плюшек, одни плюсы :smile:
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413

Black_Hole

Знающий
Сообщения
126
Репутация
11
http://ru.wikipedia.org/wiki/XMPP

есть много серверов для разных OS, сервер можно развернуть на локальном компьютере при этом созданная учетная запись без проблем соединится с другими серверами
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Black_Hole [?]
сервер можно развернуть на локальном компьютере при этом созданная учетная запись без проблем соединится с другими серверами

Мне не нужны посредники, тем более на мой взгляд единый сервер для всех клиентов - это как раз не лучший вариант.
 

Black_Hole

Знающий
Сообщения
126
Репутация
11
сервер разворачивать это если свой уникальный домен привязать, а так можно регнуться на любом сервере на яндаксе допустим, дальше скачивается клиент или свой пишется, протокол открытый исходников куча все просто :smile:

http://lurkmore.to/%D0%96%D0%B0%D0%B1%D0%B1%D0%B5%D1%80
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Интересно, как я буду реализовать видео-звонки (+ видео конференции) через него, мне нужен свой, если делать, то делать нормально, если бы хотел, мог бы просто через протокол ICQ написать... Меня больше интересуют те вопросы которые я написал в первом сообщении (делать свое) :smile:
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
Black_Hole
так Viktor1703, хочет без посредников
 

Black_Hole

Знающий
Сообщения
126
Репутация
11
без посредников это свой протокол передачи данных? сжатие, синхронизация и широковещание аудио-видео :smile:
 

BIOS

Жизнь - игра. График - супер, но сюжет - хреновый.
Сообщения
173
Репутация
69
1. Для экономии трафика нужен сервер, который бы следил за пользователями и отстукивал клииентам об появленни новых. Т.е. имеем сервер (с) клиентов (1,2,3).
1 подключается к С (теперь С знает что 1 онлайн и записывает его IP)
2 подключается к С (теперь С знает что 1 онлайн и записывает его IP)
С соображает, что 1 и 2 это друзья, поэтому обоим сообщает о том, что собеседникии онлайн и передает их IP
1 получает от С IP друга(2), цепляется к 2
2 получает от С IP друга(1), хочет подцепиться но не успевает, 1 делает это первый

Все рады, все счастливы
3 подключается к С
Т.к. 3 в КЛ 2, то С сообщает 2 о том, что 3 онлайн

Рассчмотрим уход в оффлайн
Все клиенты время от времени "пингуют" сервер, чтобы тот знал что клиент не отвалился
1 отключается от С
Теперь С рассылает 2 информацию о том, что 1 оффлайн

Полностью одноранговую сеть сделать проблематично, нужны сервера, адреса которых статичны, и которые будут сообщать клиентам динамические адреса друг друга

1+. Можно провернуть и без главных серверов. По принципу DNS - чтобы клиенты рассылали запрос о том, что ктото вышел онлайн друг другу, те еще дальше по сети и так постепенно дойдет до всех. Но в данном случае будет избыточность, +все равно нужно держать псевдо-клиентов, на случай когда в оффе будет большинство клиентов и одна часть сети не сможет достучаться до другой части.

2. Никто не запрещает в цикле проверять проверять новые подкоючения, и принимать их и обрабатывать все сокеты поочереди. А по хорошему придумать протокол, чтобы по одному соединению можно было перегонять разнородную информацию. "Пакет текста, пакет звука, пакет видео, пакет звука, пакет видео, пакет видео, пакет текста, пакет текста" и т.д.

на каждый контакт из списка открываем индивидуальный поток? - индивидуальный сокет, да, если нам не нужна сохранность оффлайн сообщений

Это я описал схему построения IM для пиринговой сети

Можно сделать схему клиент-сервер, тогда все клиенты цепляются к одному серверу и сервер уже сам перегоняет сообщения между ними. Но тут нужны нехилые сервера и каналы.
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
BIOS [?]
Полностью одноранговую сеть сделать проблематично, нужны сервера, адреса которых статичны, и которые будут сообщать клиентам динамические адреса друг друга

Для этого я и написал что нужно будет писать глобальный сервер. :smile:
 
Верх