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, но всё же мой, да и остальным участникам форума думаю будет интересно узнать
P.S. если что-то не так понял или написал, прошу поправить.
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, но всё же мой, да и остальным участникам форума думаю будет интересно узнать
P.S. если что-то не так понял или написал, прошу поправить.