Хотя вы, вероятно, не любите это слышать, я все же рекомендовал бы сначала исследовать HTTP-серверы.Хотя программирование для них показалось вам скучным, синхронным и непостоянным, это только потому, что создатели серверов сделали свою работу, чтобы настолько хорошо скрыть от вас ужасные подробности - если подумать, веб-сервер такой не синхронно (это не значит, что миллионы людей должны ждать чтения этого поста, пока вы не закончите ... параллелизм :) ... и потому что эти звери так хорошо справляются со своей работой (да, я знаю, мы кричимих много, но, в конце концов, большинство HTTP-серверов являются выдающимися частями программного обеспечения), это определенная отправная точка для изучения, если вы хотите узнать об эффективной многопоточности.Операционные системы и реализации языков программирования или игр - еще один хороший источник, но, возможно, немного дальше от того, чего вы намерены достичь.
Если вы действительно хотите испачкать пальцы, я бы предложил сначала ориентироваться на что-то вроде WEBrick - оно поставляется с Ruby и полностью реализовано в Ruby, так что вы узнаете все оРубиновые потоки понятий там.Но имейте в виду, что вы никогда не приблизитесь к производительности решения Rack, установленного поверх веб-сервера, реализованного на C, такого как thin .
Так что если вы действительно хотитеЕсли быть серьезным, вам придется свернуть собственную реализацию сервера в C (++) и, возможно, сделать так, чтобы она поддерживала Rack, если вы собираетесь поддерживать HTTP.Я бы сказал, что это задача, особенно если вы хотите, чтобы ваш конечный результат был конкурентоспособным.Код на С может быть невероятно быстрым, но слишком просто быть невероятно медленным, он лежит в природе вещей низкого уровня.И мы еще не обсуждали управление памятью и безопасность.Но если это действительно ваше желание, сделайте это, но я бы сначала покопался в известных реализациях серверов, чтобы получить вдохновение.Посмотрите, как они работают с потоками (пул) и как они реализуют «сеансы» (вы хотели постоянство).Все, что вы хотите, можно сделать с помощью HTTP, даже лучше, если использовать его с умным интерфейсом REST. Существующие приложения, поддерживающие все функции, которые вы упомянули, являются живым доказательством этого.Так что идти в этом направлении было бы не совсем неправильно.
Если вы все еще хотите изобрести собственный проприетарный протокол, основывайте его на TCP / IP как наименьшем приемлемом общем знаменателе.Выход за пределы этого закончился бы проектом, который ваши внуки, вероятно, все еще будут программировать.Это действительно так низко, как я бы осмелился пойти, когда дело доходит до сетевого программирования.
Независимо от того, используете ли вы его в качестве библиотеки или нет, изучите EventMachine и его концептуальную модель.Не обращать внимания на управляемый событиями («не блокирующий») ввод-вывод в вашем путешествии будет небрежно в контексте изучения / повторного изобретения правильных колес.Закуска для событийно-управляемого программирования, объясняющая преимущества node.js как веб-сервера .
В зависимости от ваших требований: асинхронная связь, несколько «подписчиков» реагируют на «события», которыецентрализованно опубликовано;хорошо, это действительно звучит как хороший кандидат для архитектуры, основанной на событиях / сообщениях .
Некоторые книги, которые могут быть полезны в вашем путешествии (только для Linux / C, но концепции универсальны):
(Это были классики)
- Интерфейс программирования Linux - если вы просто собираетесь купить одну книгу,пусть это будет, я еще не совсем закончил, но это действительно удивительно и охватывает все темы, которые вам нужно знать для вашего приключения
Проекты, которые вы, возможно, захотите проверить:
- Apache 2, thin, mongrel, nginx, lighttpd, ..., любой веб-сервер существует
- EventMachine (извините:)
- node.js
- Эффективное сетевое взаимодействие в игре ( Quake 3 source )