На чем написать сервер
На чем писать сервер для игры?
Оценить 4 комментария
jagev: хотите асинхронности — берите Эрланг/Эликсир, чего уж там. До 100к rps можно как угодно быдлокодить, все сожрет и не поморщится.
Главное про основные возможности отстрелить ногу почитать заранее, и все.
У нас есть опыт работы с Node.JS
не уверены, что он подойдет для игры у которой будет тысяча человек в онлайне
Я бы выбрал Go, он отлично подходит для разработки серверной части игр.
Для общения с клиентом можно использовать protobuf.
Но лучше всего вам будет нанять человека с таким опытом к себе в команду.
Поэтому ищите человека с опытом, берите его в команду.
Иван Филатов: ООП конечно круто, но от него обычно отказываются, если нужна производительность. А как жить без, можно спросить у Линуса.
p.s. не холивара ради! 🙂
Количество онлайн вообще не так считается. Все зависит от игры.
У меня был проект с онлайн под 100.000 в сутки. Легко держалось на php/fastcgi, правда для одной штуки пришлось написать примочку на ассемблере и внедрить как либу для apache, но к онлайну это отношения не имеет.
Опять таки, при высокой динамичности, проблема начинает возникать в трафике, а не в CPU.
что значит «имелся человек»? Сами и написали.
Ассемблер не такой уж и сложный, если нужно написать конкретную процедуру расчета, а не что-то более сложное. Там всего пару страниц кода было. Вполне достаточно начальных знаний.
Есть пользователь, у него есть ID и timestamp последнего обновления его данных.
Тоже выбираю сервер сейчас для игры, прочитал море отзывов про существующие сервера и технологии, пока остановился на Forge. Он запускается в инстансе Unity и поддерживает всю юнитевскую физику, коллайдеры и иже с ними, а значит Fully Authoritative на нём будет реализовать довольно просто.
P.S.: В рамках js можно было бы ещё упомянуть MeteorJS. Но на мой взгляд, если игра real-time, а не turn-based, то он не потянет.
Как я увидел в комментариях, раз уж хотите отказаться от ООП (сам не люблю его), то берите Go.
Сильно там всё равно не набыдлокодить, а вот инструменты по типу сетевых соединений и параллельная работа очень простые и легко освоите, чтобы сделать сервер.
У самого был опыт создания игрового сервера на Go, но там игра пошаговая, так что мой пример вам не поможет 🙂
7 лучших языков программирования для серверной веб-разработки
Главное меню » Программирование » 7 лучших языков программирования для серверной веб-разработки
Точно так же, когда дело доходит до серверной веб-разработки – нам в первую очередь требуется язык программирования серверной части (или, вы можете сказать, серверный), чтобы веб-сайт работал вместе с различными другими инструментами и технологиями, такими как базы данных, фреймворки, веб-серверы и т. д. и т.п.
Хорошо, позвольте нам сказать вам – вам необходимо выбрать язык программирования, учитывая различные параметры, такие как требования проекта, его кривая обучения, производительность, надежность и т. д. Кроме того, вы также должны учитывать спрос и популярность. конкретного языка программирования в мире технологий, особенно если вы хотите изучить язык программирования с точки зрения карьеры, поскольку нет смысла изучать язык программирования, который устарел или не востребован на рынке.
В этой статье мы предоставляем вам список лучших языков программирования, которые вы можете изучить, чтобы начать веб-разработку:
1. JavaScript
Всякий раз, когда речь идет о веб-разработке – скорее всего, в 9 из 10 случаев речь идет о названии JavaScript. Согласно ежегодным отчетам различных популярных платформ, таких как Stack Overflow и Octoverse, JavaScript является одним из наиболее предпочтительных и ведущих языков программирования в мире технологий. Одна из основных причин этого заключается в том, что конкретный язык может использоваться как для интерфейсной веб-разработки, так и для внутренней веб-разработки. Глядя на несколько прошлых тенденций и статистику, можно сказать, что популярность Node.js каким-то образом увеличила использование JavaScript в качестве внутреннего языка для веб-разработки. Между тем, язык предоставляет вам несколько замечательных функций для внутренней разработки, таких как облегченный язык сценариев, динамический набор текста, интерпретируемый, поддержка объектно-ориентированного программирования, проверка на стороне клиента,
2. Python
Хотя Python довольно известен среди людей своей совместимостью с передовыми технологиями, такими как машинное обучение, Интернет вещей (IoT), Data Science и т. д., Позвольте нам сказать вам, что этот обогащающий язык программирования широко используется и очень подходит для серверной веб-разработки. также. Даже один из ведущих ИТ-гигантов в настоящее время Google в значительной степени полагается на Python, и это один из трех основных языков, используемых Google (два других – Java и C ++). Одним из основных преимуществ использования Python для веб-разработки является огромная коллекция стандартных библиотек, которые делают работу разработчиков сравнительно простой и эффективной. Дополнительные выдающиеся и уникальные особенности Python, такие как улучшенная читаемость кода. более простая интеграция с другими языками, поддержка программирования GUI, переносимость,
3. PHP
PHP (или, можно сказать, препроцессор гипертекста) – ветеран в мире веб-разработки. Этот серверный язык сценариев с открытым исходным кодом создан в 1994 году и специально используется для веб-разработки. Поскольку это интерпретируемый язык – он также не требует компилятора, а также может работать практически во всех основных операционных системах, таких как Windows, Linux, macOS, Unix и т. д. Говоря о расширяющих функциях PHP, таких очень много. простота в освоении, кроссплатформенная совместимость, функции ООП, поддержка различных стандартных баз данных, таких как MySQL, SQLite и т. д., огромная поддержка сообщества и многие другие. В остальном PHP очень безопасен как язык сценариев на стороне сервера, поскольку в PHP имеется множество хеш-функций для шифрования данных пользователя. В частности,
4. Java
5. Ruby
Ruby – это интерпретируемый язык программирования общего назначения, который поддерживает различные парадигмы программирования, такие как процедурное, функциональное и объектно-ориентированное программирование. Этот язык широко используется для веб-разработки по всему миру и очень рекомендуется новичкам для начала работы с серверной веб-разработкой, так как он сравнительно проще в освоении. Как и Python, Ruby также фокусируется на повышении производительности разработчиков, что в конечном итоге ускоряет процесс веб-разработки. Конкретный язык поддерживает почти все основные платформы, такие как Windows, Mac и Linux, и позвольте нам также сказать вам, что Ruby сильно основан на многих других языках программирования, таких как Perl, Lisp, Eiffel, Ada и т. д. Динамическая типизация и Duck набор текста, автоматический сбор мусора, большая стандартная библиотека, настраиваемое поведение отправки, гибкость и
6. Golang
Если вы думаете, что Go не так популярен среди разработчиков, позвольте нам сказать вам, согласно прошлогоднему отчету Stack Overflow – это был один из 5 самых любимых языков программирования разработчиками во всем мире. Go – это статически типизированный язык программирования, разработанный в Google и имеющий синтаксис, очень похожий на язык C. Язык позволяет разработчикам более эффективно создавать масштабируемые и безопасные веб-приложения. Одним из основных преимуществ использования Go является то, что он обеспечивает отличную поддержку многопоточности, а также имеет функцию сборки мусора для автоматического управления памятью. Некоторые из других значительных особенностей языка Go – это простой в изучении, читаемый код, поддерживаемый Google, скомпилированный язык, управление пакетами, мощная стандартная библиотека, поддержка параллелизма, высокая производительность и многое другое.
C# – один из тех немногих языков, который в течение последних нескольких лет постоянно входит в пятерку лучших языков программирования по различным стандартным индексам. Однако вам необходимо знать, что этот универсальный язык изначально был разработан Microsoft в первую очередь для среды.Net. Наряду с серверной веб-разработкой, теперь C # широко используется во многих областях, таких как разработка приложений Windows, разработка игр и т. д. Язык предоставляет вам различные дополнительные функции, такие как более быстрая компиляция, совместимость, масштабируемость и возможность обновления, компонентно-ориентированная. & структурированный язык и многие другие. Кроме того, C # предлагает богатый набор библиотек, которые помогают разработчикам ускорить и повысить эффективность процесса разработки. Следовательно,
Итак, мы упомянули наиболее рекомендуемые и стоящие языки программирования для серверной веб-разработки, которые вы можете изучить. Однако позвольте нам еще раз напомнить вам, что прежде чем выбирать какой-либо конкретный язык из вышеупомянутых, вам необходимо рассмотреть различные индивидуальные аспекты, в том числе ваши цели, требования к проекту, кривую обучения и т. д.
Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.
Начинающему сетевому программисту
В общем, посмотрев на всё это, я решил написать базовую статью по созданию простейшего клиент-сервер приложения на С++ под Windows с детальным описанием всех используемых функций. Это приложение будет использовать Win32API и делать незамысловатую вещь, а именно: передавать сообщения от клиента к серверу и обратно, или, иначе говоря – напишем программу по реализации чата для двух пользователей.
Сразу оговорюсь, что статья рассчитана на начинающих программистов, которые только входят в сетевое программирование под Windows. Необходимые навыки – базовое знание С++, а также теоретическая подготовка по теме сетевых сокетов и стека технологии TCP/IP.
Теория сокетов за 30 секунд для «dummies»
Начну всё-таки немного с теории в стиле «for dummies». В любой современной операционной системе, все процессы инкапсулируются, т.е. скрываются друг от друга, и не имеют доступа к ресурсам друг друга. Однако существуют специальные разрешенные способы взаимодействия процессов между собой. Все эти способы взаимодействия процессов можно разделить на 3 группы: (1) сигнальные, (2) канальные и (3) разделяемая память.
Для того, чтобы сокеты заработали под Windows, необходимо при написании программы пройти следующие Этапы:
Инициализация сокетных интерфейсов Win32API.
Инициализация сокета, т.е. создание специальной структуры данных и её инициализация вызовом функции.
«Привязка» созданного сокета к конкретной паре IP-адрес/Порт – с этого момента данный сокет (его имя) будет ассоциироваться с конкретным процессом, который «висит» по указанному адресу и порту.
Для серверной части приложения: запуск процедуры «прослушки» подключений на привязанный сокет.
Для клиентской части приложения: запуск процедуры подключения к серверному сокету (должны знать его IP-адрес/Порт).
Акцепт / Подтверждение подключения (обычно на стороне сервера).
Обмен данными между процессами через установленное сокетное соединение.
Закрытие сокетного соединения.
Итак, попытаемся реализовать последовательность Этапов, указанных выше, для организации простейшего чата между клиентом и сервером. Запускаем Visual Studio, выбираем создание консольного проекта на С++ и поехали.
Этап 0: Подключение всех необходимых библиотек Win32API для работы с сокетами
Сокеты не являются «стандартными» инструментами разработки, поэтому для их активизации необходимо подключить ряд библиотек через заголовочные файлы, а именно:
WinSock2.h – заголовочный файл, содержащий актуальные реализации функций для работы с сокетами.
WS2tcpip.h – заголовочный файл, который содержит различные программные интерфейсы, связанные с работой протокола TCP/IP (переводы различных данных в формат, понимаемый протоколом и т.д.).
Также нам потребуется прилинковать к приложению динамическую библиотеку ядра ОС: ws2_32.dll. Делаем это через директиву компилятору: #pragma comment(lib, “ws2_32.lib”)
Ну и в конце Этапа 0 подключаем стандартные заголовочные файлы iostream и stdio.h
Итого по завершению Этапа 0 в Серверной и Клиентской частях приложения имеем:
Обратите внимание: имя системной библиотеки ws2_32.lib именно такое, как это указано выше. В Сети есть различные варианты написания имени данной библиотеки, что, возможно, связано иным написанием в более ранних версиях ОС Windows. Если вы используете Windows 10, то данная библиотека называется именно ws2_32.lib и находится в стандартной папке ОС: C:/Windows/System32 (проверьте наличие библиотеки у себя, заменив расширение с “lib” на “dll”).
Этап 1: Инициализация сокетных интерфейсов Win32API
Прежде чем непосредственно создать объект сокет, необходимо «запустить» программные интерфейсы для работы с ними. Под Windows это делается в два шага следующим образом:
Нужно определить с какой версией сокетов мы работаем (какую версию понимает наша ОС) и
Запустить программный интерфейс сокетов в Win32API. Ну либо расстроить пользователя тем, что ему не удастся поработать с сокетами до обновления системных библиотек
Итого код Этапа 1 следующий:
Да, кода мало, а описания много. Так обычно и бывает, когда хочешь глубоко в чем-то разобраться. Так что на лабе будешь в первых рядах.
Этап 2: Создание сокета и его инициализация
Тип сокета: обычно задается тип транспортного протокола TCP ( SOCK_STREAM ) или UDP ( SOCK_DGRAM ). Но бывают и так называемые «сырые» сокеты, функционал которых сам программист определяет в процессе использования. Тип обозначается SOCK_RAW
Тип протокола: необязательный параметр, если тип сокета указан как TCP или UDP – можно передать значение 0. Тут более детально останавливаться не будем, т.к. в 95% случаев используются типы сокетов TCP/UDP.
При необходимости подробно почитать про функцию socket() можно здесь.
Код Этапа 2 будет выглядеть так:
Этап 3: Привязка сокета к паре IP-адрес/Порт
Сокет уже существует, но еще неполноценный, т.к. ему не назначен внешний адрес, по которому его будут находить транспортные протоколы по заданию подключающихся процессов, а также не назначен порт, по которому эти подключающиеся процессы будут идентифицировать процесс-получатель.
В ней уже более понятные пользователю поля, а именно:
Технический массив на 8 байт ( sin_zero[8] )
Соответственно, ввод данных для структуры типа sockaddr_in выглядит следующим образом:
Создание структуры типа sockaddr_in : sockaddr_in servInfo;
Заполнение полей созданной структуры servInfo
В случае ошибки функция возвращает значение меньше 0.
Соответственно, если мы хотим привязать сокет к локальному серверу, то наш код по преобразованию IPv4 адреса будет выглядеть так:
erStat = inet_pton(AF_INET, “127.0.0.1”, &ip_to_num);
Результат перевода IP-адреса содержится в структуре ip_to_num. И далее мы передаем уже в нашу переменную типа sockaddr_in значение преобразованного адреса:
Этап 4 (для сервера): «Прослушивание» привязанного порта для идентификации подключений
После вызова данной функции исполнение программы приостанавливается до тех пор, пока не будет соединения с Клиентом, либо пока не будет возвращена ошибка прослушивания порта. Код Этапа 4 для Сервера:
Этап 4 (для Клиента). Организация подключения к серверу
Функция возвращает 0 в случае успешного подключения и код ошибки в ином случае.
Этап 5 (только для Сервера). Подтверждение подключения
Всё, соединение между Клиентом и Сервером установлено! Самое время попробовать передать информацию от Клиента к Серверу и обратно. Как мы в начале и договорились, мы будет реализовывать простейший чат между ними.
Этап 6: Передача данных между Клиентом и Сервером
Рассмотрим прототипы функций recv() и send() :
Флаги в большинстве случаев игнорируются – передается значение 0.
Функции возвращают количество переданных/полученных по факту байт.
Как видно из прототипов, по своей структуре и параметрам эти функции совершенно одинаковые. Что важно знать:
и та, и другая функции не гарантируют целостности отправленной/полученной информации. Это значит, что при реализации прикладных задач по взаимодействию Клиента и Сервера с их использованием требуется принимать дополнительные меры для контроля того, что все посланные байты действительно посланы и, что еще более важно, получены в том же объеме на другой стороне
предельно внимательно надо относиться к параметру «размер буфера». Он должен в точности равняться реальному количеству передаваемых байт. Если он будет отличаться, то есть риск потери части информации или «замусориванию» отправляемой порции данных, что ведет к автоматической поломке данных в процессе отправки/приёма. И совсем замечательно будет, если размер буфера по итогу работы функции равен возвращаемому значению функции – размеру принятых/отправленных байт.
В качестве буфера рекомендую использовать не классические массивы в С-стиле, а стандартный класс С++ типа char, т.к. он показал себя как более надежный и гибкий механизм при передаче данных, в особенности при передаче текстовых строк, где важен терминальный символ и «чистота» передаваемого массива.
Процесс непрерывного перехода от send() к recv() и обратно реализуется через бесконечный цикл, из которого совершается выход по вводу особой комбинации клавиш. Пример блока кода для Серверной части:
Пришло время показать итоговый рабочий код для Сервера и Клиента. Чтобы не загромождать и так большой текст дополнительным кодом, даю ссылки на код на GitHub:
Несколько важных финальных замечаний:
В итоговом коде я не использую проверку на точное получение отосланной информации, т.к. при единичной (не циклической) отсылке небольшого пакета информации накладные расходы на проверку его получения и отправку ответа будут выше, чем выгоды от такой проверки. Иными словами – такие пакеты теряются редко, а проверять их целостность и факт доставки очень долго.
При тестировании примера также видно, что чат рабочий, но очень уж несовершенный. Наиболее проблемное место – невозможность отправить сообщение пока другая сторона не ответила на твоё предыдущее сообщение. Суть проблемы в том, что после отсылки сообщения сторона-отправитель вызывает функцию recv(), которая, как я писал выше, блокирует исполнение последующего кода, в том числе блокирует вызов прерываний для осуществления ввода. Это приводит к тому, что набирать сообщение и что-то отправлять невозможно до тех пор, пока процесс не получит ответ от другой стороны, и вызов функции recv() не будет завершен. Благо введенная информация с клавиатуры не будет потеряна, а, накапливаясь в системном буфере ввода/вывода, будет выведена на экран как только блокировка со стороны recv() будет снята. Таким образом, мы реализовали так называемый прямой полудуплексный канал связи. Сделать его полностью дуплексным в голой сокетной архитектуре достаточно нетривиальная задача, частично решаемая за счет создания нескольких параллельно работающих потоков или нитей (threads) исполнения. Один поток будет принимать информацию, а второй – отправлять.
В последующих статьях я покажу реализацию полноценного чата между двумя сторонами (поможет разобраться в понятии «нити процесса»), а также покажу полноценную реализацию прикладного протокола по копированию файлов с Сервера на Клиент.
На каком языке писать сервер?
Re: На каком языке писать сервер?
Re: На каком языке писать сервер?
java. корок не бывает, memory leak’и не беспокоят. есть дебаггеры, интегрированные среды разарботчика. сокорость в серверных приложениях приближается к скорости программ на си++.
Re: Re: На каком языке писать сервер?
Аноним, видимо, пошутил про скорость жабы, сравнимую с C++;)))
Честно говоря, в среде разработчиков, кто профессионально разрабатывает серверный софт на коммерческих UNIX’ах, даже сама постановка вопроса о сравнении по скорости и потребляемым ресурсам (память) C++ и жабы, вызывает, мягко говоря, некоторое недоумение.
Как бы не упирались маркетологи по поводу универсальности жабы, всегда есть и останется такое явление, как натурный эксперимент. Возьми и попробуй. И если окажется так, что тебе понравится жаба, то просто ты еще не перерос ту грань, за которой подобные средства разработки не приемлемы.
p.s. если на C++ программы работают медленно (сравнимо с жабой), то в этом не язык виноват, а прокладки, которые находятся между клавиатурой и стулом.
Re: На каком языке писать сервер?
Re: Re: На каком языке писать сервер?
Re: На каком языке писать сервер?
Re: Re: На каком языке писать сервер?
Re: На каком языке писать сервер?
Э, а можно мне, как фанату Ады, поинтересоваться, в чём это gnat нечестный? 🙂 И что за сервер имеется в виду?
Re: На каком языке писать сервер?
Про скорость java отнюдь не шутка. В версии 1.3 скорость заметно улучшилась, особенно это заметно на вычислительных задачах. Бенчмарки java vs c++ можно найти здесь:
Re: На каком языке писать сервер?
2 justme: Ну, может, не совсем корректный термин. Типа дергает
сишные функции из либсов с мясом. Да еще и переменные к ним
надо конветировать, блин. Короче, я попробовал только ps
кастрированный начирикать, дык у меня прога разбухла супротив
сишной раза в два. Если убедишь, что я не прав, буду только рад.
Re: На каком языке писать сервер?
>с адресной арифметикой,
PS: а сервер точно лучше на C писать.
Re: На каком языке писать сервер?
Re: На каком языке писать сервер?
> PS: а сервер точно лучше на C писать.
Аргументируй, а то голословно получается. В Си нет поддержки потоков на уровне языка, нет модулей, нет динамической сборки мусора, нет обработки исключительных ситуаций, нет нормальной поддержки строк (strcpy и co не предлагать).
Нормальной обработки исключительных ситуаций нет даже в си++. На мой взгляд не стоит использовать на стороне сервера язык в котором конструкция вида int *a=NULL; try < *a = 12345; >catch (. ) < >> гарантированно приводит к падению программы.
2 Kasper: примеры в интернете есть не только для си.
Re: На каком языке писать сервер?
2 последний anonymous: Ну посмешил. 🙂
Re: На каком языке писать сервер?
Ничего не имеюпротив явы и еще чего угодно,пишите хоть на
баше )))
Re: На каком языке писать сервер?
Re: Re: На каком языке писать сервер?
Re: На каком языке писать сервер?
Re: Re: На каком языке писать сервер?
Re: Re: На каком языке писать сервер?
Ну давай, построй мне формальную модель системы типов в дурацком Цэ, в процессе этого дела и поймёшь, в чём ублюдочность. Потом сравни с системой Хиндли-Милнера, и после этого без отвращения на Цэ смотреть уже не сможешь.
Зачем нужна адресная арифметика, я вообще не понимаю. И ты этого объяснить не сможешь, так что даже не пытайся.
Что такое мусор ты знаешь наверняка, не обманывай. Не верю я, что тебе так нравится кучу free() писать, и потом лики отлавливать. Вызов функции в Цэ ублюдочен чрезвычайно, так что хвостовую рекурсию приходится самостоятельно, ручками раскручивать. Что тоже не радует.
Re: Re: На каком языке писать сервер?
Да уж куда оголтелым цешникам и жаболюбам знать, что на exception-ах очень даже весело логику строить можно, а вовсе не только ошибки отлавливать.
Re: Re: Re: На каком языке писать сервер?
Re: Re: На каком языке писать сервер?
1) На Ocaml можно и вполне себе императивно писать, в процессе апгрейда мозгов. Постепенно мозги развивать иногда всё же лучше, чем скачком.
Re: На каком языке писать сервер?
Насчёт GNAT’а: вообще-то особых причин, по которым генерируемый им код должен быть больше, чем C, я не вижу. За исключением run-time библиотеки и проверок. Но я смотрю, Антихрист тут успешно проталкивает OCaml, так что мне агитировать за Аду, по всей видимости, бесполезно.
Re: Re: На каком языке писать сервер?
Re: На каком языке писать сервер?
Ок, сеньк»ю вери матч ту ол оф ю.
Re: На каком языке писать сервер?
Re: На каком языке писать сервер?
> Assuming that it is not mission critical and not really big, OCAML, ADA, Java, Perl, anything. *choke* Ada не для big и mission-critical? Излюбленный язык NASA и DoD.
> I’d say COBOL, but as far as i know there are no suitable compilers for COBOL under linux. which is a pity. А за такие предложения вообще расстреливать на месте надо.
Антихристу: CL-HTTP, в общем-то, плохой пример функционального стиля.
Re: На каком языке писать сервер?
> Assuming that it is not mission critical and not really big, OCAML, ADA, Java, Perl, anything.
*choke* Ada не для big и mission-critical? Излюбленный язык NASA и DoD.
> I’d say COBOL, but as far as i know there are no suitable compilers for COBOL under linux. which is a pity.
А за такие предложения вообще расстреливать на месте надо.
Антихристу: CL-HTTP, в общем-то, плохой пример функционального стиля.
Re: Re: На каком языке писать сервер?
Re: На каком языке писать сервер?
> Could you explain why?
Попробуй пописать на Коболе, поймешь. Некоторые думают что внося в язык программирования неоднозначность и раздутость естественного языка они делают исходники читабельнее а программы надежнее, но только малая часть человечества настолько мазохисты чтобы пользоваться их шедеврами.
А к расправе над коболистами еще Дийсктра призывал, так что я тут вполне консервативен.
> Now, Java code in any realisation is MUCH MUCH slower than code compiled to native like ada, c, etc.
In any? А о JIT компиляторах слыхал? Тестировал?
И что, ява медленне перла? PHP? Ты же говорил *the slowest solution*?
> One more time if you are saying that it is not you have never been counting miliseconds.
Once more, если задача heavily CPU-bound, C/C++ обычно *тоже* слишком медленный. А грамотное использование профайлера и нормального языка в сочетании с ассемблерными вставками в критических циклах даст гораздо больший эффект.
> What I meant was that if you pass from C++ to Java..you have to acquire some extra knowledge but its minimal, while passing from C++ to OCAML would require much more studying.
Изучение языка занимает небольшое время (особенно если ты уже знаком с 5-6 достаточно разных языков), по сравнению с изучением методологии этого языка. Ява это не только синтаксис, это API, EJB, JavaBeans, JSP, whatever. Это все за 21 день не выучишь.
> Judging by this posting of yours you just wanted to show off.
Я так глубоко не рефлексировал. Возможно, но маловероятно.
Судя же по твоим высказываниям, ты пытаешься скрыть за посредственным английским отсутствие практического опыта. Только мазохист или дилетант будет советовать писать сервер на ассемблере или коболе.