(легкий) Instant Messenger: C # .Mono, node.js или другие?

Какой язык программирования мне следует использовать для написания программы обмена мгновенными сообщениями? Вот цели:

  • должен иметь возможность обрабатывать много-много пользователей (по крайней мере, для подтверждения концепции)
  • протокол должен быть основан на json или, возможно, на двоичных данных. Я думаю, что json проще реализовать и расширить. Я не хочу использовать XML из-за накладных расходов. Я знаю, что данных не так много, но они должны быть максимально быстрыми, особенно в медленных сетях (например, мобильных).
  • пользователи должны иметь возможность входить в систему на нескольких устройствах одновременно
  • история должна сохраняться на стороне сервера, чтобы ее можно было просматривать на всех устройствах
  • сервер должен поддерживать в рабочем состоянии множество неактивных клиентов
  • передача файлов (не совсем уверен, как это реализовать, возможно, другой сетевой сокет, чтобы он не блокировал сообщения чата на стороне клиента)
  • MySQL аутентификация

(Нет, XMPP не вариант).

Я веб-разработчик с хорошим опытом работы с PHP, но это не вариант для этого проекта. У меня также есть опыт работы с Javascript (в основном для веб-сайтов), но мне было бы легко работать с node.js, и у меня мало опыта работы с C # .Net, а также я мог бы написать C # .Mono. Сервер, который я хочу написать, должен работать в Linux. У меня нет опыта работы с Java, но если это лучший способ, я могу это изучить.

Я много читал о node.js и о том, что этот ввод-вывод действительно хорош для сетевых приложений и веб-серверов. А как насчет мессенджеров? Основная часть - сохранять сообщения и передавать их другим участникам комнаты, так что это «сеть».

Я также подумал о C #, который предлагает асинхронные сокеты, которые работают с пулом потоков afaik вместо очереди событий.

Я не уверен, какой из них наиболее эффективен в отношении IM-сервера.

Было бы неплохо, если бы кто-нибудь мне подсказал. Я знаю, что C ++, вероятно, был бы лучшим способом, но мне почему-то не очень нравится этот язык, и его трудно выучить.


person Spammer    schedule 31.05.2011    source источник


Ответы (2)


Вы можете делать все это на любом нормальном языке программирования (C #, Java, C ++ и т. Д.), Если вы достаточно компетентны в этом языке.

person SLaks    schedule 31.05.2011

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

Если вам нужно что-то, что даст вам некую основу для упрощения работы в сети, я бы порекомендовал попробовать Erlang, но это может быть сложно изучить для одного проекта. node.js может быть сложным в отношении поддержки активности / управления ресурсами при неработающих соединениях и аналогичных сценариях, когда вы действительно не получаете событие.

Если вы уже знакомы с C #, использование моно может быть самым безопасным / быстрым для вас. Кроме того, вы можете писать что угодно на любом языке - просто используйте то, что вам удобно (если вы на самом деле не хотите изучать что-то новое).

Я не знаю, почему вы написали, что jabber не подходит, но если вам не нужна только технология xmpp, почему бы не использовать типичный прокси / сервер SIP? (например, OpenSIPS) У него уже доступны обработка запросов MESSAGE, подписки, авторизация (с помощью db) и пакеты keepalive. Вы можете масштабировать / кластеризовать / разделять OpenSIPS практически любым удобным для вас способом.

person viraptor    schedule 31.05.2011
comment
Я не очень разбираюсь в сети ... Асинхронные сокеты лучше синхронных в таком проекте? Сообщения чата обычно довольно маленькие и блокируются только на несколько миллисекунд. - person Spammer; 31.05.2011
comment
Отправка tcp-сообщения может блокироваться на произвольное время. Вы можете решить эту проблему с помощью потоковых или асинхронных сокетов. Если вы действительно хотите масштабироваться для большого количества пользователей, вам никогда не нужно блокировать - просто поставьте в очередь и отправьте, как только вы узнаете, что это возможно. Вероятно, даже пул потоков с асинхронными диспетчерами - это выход, поскольку вам придется чередовать пакеты keepalive, обычные сообщения и передачу файлов. - person viraptor; 31.05.2011
comment
Это своего рода часть моего первоначального вопроса. С node.js движок JS делает это за меня, поэтому я могу обрабатывать сообщения чата как события. На C # у меня есть возможность использовать пулы потоков (я думаю, что BeginX на C # уже использует пул потоков. В противном случае он бы порождал и убивал огромное количество потоков) - person Spammer; 31.05.2011
comment
Если я что-то не пропустил, обработка незанятых соединений в node.js. Вы можете отложить отправку, но это мало что скажет вам о текущем состоянии, и пакеты поддержки активности могут начинаться в очереди сами по себе. У вас осталось мертвое состояние / сокет, который вам нужно очистить (просто Google для управления ресурсами node.js на мертвых соединениях, чтобы увидеть, сколько неочевидных ситуаций может возникнуть) - person viraptor; 31.05.2011
comment
Обработка незанятых соединений в node.js не проблема, даже если вы хотите убедиться, что соединения не истекают по тайм-ауту: отправляйте пинг каждому клиенту каждые X секунд, все клиенты с истекшим тайм-аутом будут определяться как ушедшие. - person Tobias P.; 31.05.2011