(495) 925-0049, ITShop интернет-магазин 229-0436, Учебный Центр 925-0049
  Главная страница Карта сайта Контакты
Поиск
Вход
Регистрация
Рассылки сайта
 
 
 
 
 

Чат на ASP: от простого к сложному (исходники)

Источник: WMATE
Олег Яцура

Данная статья является пробным камнем в огород ASP-чатстроительства...

Итак, требуется создать чат-сервер на ASP - ну так давайте сразу из огня да в полымя...

Во-первых, сразу разберемся - а что такое чат с точки зрения программиста? Да нет ничего проще - имеем один общедоступный массив, в который, по идее, должны складываться все фразы, посланные каждым пользователем и плюс механизмы для передачи от каждого пользователя его посланий в этот массив и наоборот - передачи всех (или не всех) данных этого массива всем (или, опять же, не всем) пользователям. Вот, если не все, то почти все...

Теперь посмотрим, как сие нам можно без особых потугов создать на ASP... Можно много и по "разному" отзываться о программистах Microsoft да и о самой конторе в целом, но вот за объект Application в данном случае можно только сказать спасибо. И правда, для создания общедоступного массива данных в ASP лучше не придумаешь. Итак, создаем файл global.asa (если он еще не создан) и в Application_OnStart добавляем следующий код:

dim MyMessArray()
Redim MyMessArray(20)
Application("MessageArray")=MyMessArray

Таким образом мы создали массив MessageArray размерностью 20. Именно в нем и будут храниться все фразы пользователей в чате (размерность, естественно, зависит от вас, но, во-первых, врядли хотя бы четверти пользователей вашего чат-сервера ну очень сильно нужно будет сразу наблюдать на экране 50 или 100 фраз сразу, а, во-вторых, ресурсы сервера тоже не безграничны).

В принципе, на этом можно и закончить :-). Ну, почти закончить. А в виду того, что только три китайских "почти" и только в китае берут за одно целое, мы продолжим.

Сама организация записи\чтения, естественно, просто как два байта. Берем фразу, полученную от пользователя и пишем ее в наш массив:

dim NewMess()
Redim NewMess(20)

usermess=Request("message")
messArray=Application("MessageArray")

for i=0 to 19
	NewMess(i+1) = messArray(i) 
next

NewMess(0)=usermess
Application.Lock
Application("MessageArray")=NewMess
Application.UnLock 

Если разобрать вышеуказанный код построчно, то:

  • объявили массив NewMess
  • в переменную usermess занесли данные, полученные от пользователя
  • переписали содержимое массива MessageArray, созданного на базе объекта Application,в свежеобъявленный массив NewMess
  • далее произвели "сдвиг вниз" на одну позицию
  • в нулевую позицию записали полученные данные от пользователя
  • залочили Application
  • переписали массив NewMess в MessageArray
  • разлочили Application

Со чтением и выводом на экран пользователей проще:

messArray=Application("MessageArray")
for i=0 to 20
  Response.Write messArray(i)
  Response.Write ("<br>")
  Response.Write Chr(13)
next

...и построчно:

  • переписываем содержимое общедоступного массива MessageArray в messArray
  • и в цикле выводим по очереди все фразы из массива, незабывая "втыкать" возврат каретки для браузера в виде <br> и для облегчения просмотра в виде Chr(13) :-))

Ну вот теперь точно все, разве что за исключением определенных тонкостей, на разработку и реализацию которых может уйти вся жизнь :-)). Самое главное здесь, не забыть, что у вас должно присутствовать, как минимум, или два окна (но сие, по моему - бред) или два фрейма - один с формой ввода и, соответственно, с кодом для записи фраз в общедоступный массив и, второй "самообновляющийся" фрейм (окно), т.е. в данном фреме (окне) должно быть указано в эелементе META конкретное значене Refresh, с кодом вывода массива...

Ну что ж, чат у нас, можно сказать, уже работает. Существует окно ввода и окно с фразами, можно писать в первом, что душа пожелает, и наблюдать начертанное во втором. Ну просто верх творения ума человеческого. Но что-то как-то не совсем...

Для начала создадим "неполную" авторизацию пользователя. Для этого создаем стартовую страницу чата (если таковой еще нет) примерно следующим образом:

<html>
<body>
<form method=post action=chat.asp name="mForm"
target="_top">
имя (Login): <input type=text name="userName" size=12>
<input type=submit value=" Ok ">
</form>
</body>
</html>

Далее мастерим сам chat.asp:

<frameset rows="*,68">
<frame src="chatbody.asp" name=bod scrolling="yes">
<frame src="chatinput.asp" name=menu scrolling="no">
</frameset>

Здесь мы, соответственно, создали два фрейма : chatbody.asp - фрейм с фразами, chatinput.asp - фрейм с полем ввода.

Теперь добавим немного кода в chat.asp и создадим ту самую "неполную" авторизацию:

  <%
  Session("Login")=request("userName")
   if Session("Login") = "" then
    Session("Login") = "некто"
   end if 
  
   if  Session("dooropen")=0 then
     Session("dooropen")=1
       
     dim NewMess()
     Redim NewMess(20)

     messArray=Application("MessageArray")

      for i=0 to 19
       NewMess(i+1) = messArray(i) 
      next

    NewMess(0)=Session("Login") & "снова с нами..."
     Application.Lock
     Application("MessageArray")=NewMess
     Application.UnLock 
    
    end if     

  %>

И что же мы сделали? Всего навсего зверски выпытали у входящего пользователя его имя и решили его запомнить хорошенько, заодно предупредив находящихся уже в чате о его прибытии:

  • получили данные из формы и сразу же занесли ее в Session-переменную Login
  • на тот случай, если пользователь поленился вводить что-либо и просто жмакнул кнопкой, обозвали его нектой (будет в будущем умнее)
  • проверили посредством Session-переменной dooropen, зашел ли уже этот пользователь. Если нет, то отмечаем сей факт опять же в Session-переменной dooropen присваивая ей значение 1 и...
  • уже по известной нам методике передачи новой фразы в общий массив данных (Application("MessageArray")) производим в нем сдвиг вниз и записывем самой первой фразой извещение о прибытии нового пользователя с сообщением его имени.

Для чего здесь служит Session-переменная dooropen? А вы попробуйте ее не использовать? И тогда при каждом обновлении родительского окна, тоесть chat.asp будете получать событие входа нового пользователя. Пока вся система еще только лишь во всеуслышанье извещает о сим факте - ничего ужастного в этом, в принципе, и нет, а что будет дальше? А вот при таком простом подходе один раз занесем значение единицы в Session-переменную и, пока не будет уничтожена сессия, dooropen будет его хранить, не давая тем самым ложных входов.

Стоит заметить, что в файле global.asa следует все же создать процедуру Session_OnStart и указать в ней Session("dooropen") = 0, я бы еще посоветовал тут же конкретизировать таймауты сессии ( Session.Timeout = 10 ), но сие не к спеху.

Ну, пожайлуй, для начала хватит. Разве что свериться кодами с chatinput.asp (chatbody.asp, отвечающего за вывод фраз на экран пользователя) мы не планировали изменять. У вас в chatinput.asp должно быть примерно следующее:

<form method=post action=chatinput.asp target=_self name=mForm>
  <Select Name=Type>
   <Option Value=Phrase>сказать</option>
   <Option Value=Action>сделать</option>
  </Select>
  <input type=text size=39 maxlength=255 name=mess>
  <input type=submit value=" Ok ">
</form>

  <%

  If (Request("mess") <>"" then

  Messa = Session("Login") & ": " & Request("mess")

  if Request("Type")="Action" then
  Messa="<i>" & Messa & "</i>"
  end if

  dim NewMess()
  Redim NewMess(20)

  messArray=Application("MessageArray")

  for i=0 to 19
  NewMess(i+1) = messArray(i)
  next

  NewMess(0)= Messa
   Application.Lock
   Application("MessageArray")=NewMess
  Application.UnLock

end if
%>

Надеюсь, что данный код не столь уж и непонятен :-).

Мир прекрасен и удивителен. Все работает, все крутится и вертится. Но, пора и задуматься (пока еще не поздно и не жалко выбрасывать в корзину готовый программный код), а зачем все это надо? Не проще ли использовать Microsoft Chat или, скажем, Mirc? Взял, поставил, запустил - и без проблем... Сей вопрос волнует умы уже давно и весьма спорен по своей сути. Во-первых, все зависит от того, с какой точки зрения к этому подходить. Если с точки зрения творчества - то тут уж кому что нравится (ну вот нравится мне, допустим, писать приложения именно под WEB и все тут). А во-вторых, при использовании уже готовых стандартных средств общения вам придется "подстраиваться" под то что есть (собственной "изюминки" у вас уже не будет).

Есть еще пара плюсов использования именно WEB-технологий: это отсутствие "головной боли" с клиентской частью (ну, не совсем, конечно, но все же...) и гибкость интрефейса при использовании HTML. На самом же деле, любой создатель сайта почему-то строит свой сервер именно под WEB и именно под "стандартные" браузеры, а не создает свои протоколы, клиенты, языки и так далее. Не стоит ли задуматься над этим?

Ну да ладно, хватит пререливать из пустого в порожнее, пора заняться созданием той самой "изюминки". Здесь сразу нужно определиться, для чего и почему вы создаете свой чат-сервер. В подобной ситуации можно идти двумя путями: придумать сногсшибательное название, а потом выстроить все остальное в соответствии с ним, или наоборот - выстроить четкую структуру, а потом уже ломать голову над тем, как все это безобразие обозвать :-)). Кстати, сие вполне серьезно. Если вы в самом начале решили обозвать свое творение "Отель у погибшего альпиниста", то вряд ли в него впишутся всякие рыцари и драконы. Вас просто не поймут.

Не стану склонять вас ни к тому ни к другому варианту, дам для начала пару рекомендаций в построении общей виртуальной структуры:

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

Для наглядности могу привести пример собственного чат-сервера. В виду того, что угораздило меня родиться потомственным железнодорожником в третьем поколении (сам бог велел не в космонавты ломиться, раз уж дед, отец и мать более полувека на стальных магистралях). То и далеко ходить не стал. Нарек чат " Станция Гадюкино". Отсюда и всяческие паравозы с кастылями в дизайне, дежурный по станции - бот в чате, статус администрадора - ДС (для непосвященных, ДС по жд абревиатуре - начальник станции) ну и так далее (самый младший статус, кстати, стрелочник :-))) ...

Ну что, пофантазировали? Нарисовали себе целый виртуальный мир, который будет "жить" на вашем сервере, подчиняясь созданным вами (или уже самими пользователями) законам, с прекрасными замками и простыми лачугами, с базарными площадями, полицейскими участками и судами, многопартийностью и всяким прочим хламом? :-) Теперь хоть до самого утра мне можете рисовать прелести всяких мирков и мелкомягких чатов, такого там нет и пока не предвидется :-)). Желательно нарисовать всю эту красоту на бумажке и повесить на стену - уже пол - дела, можно сказать, сделано :-). Здесь дам пару советов: во-первых, не стоит сразу хвататься за все это великолепие, каким бы сильным программистом вы себя не считали, задача (по закону того же Мерфи) приобретет умопомрпачительные размеры и погребет вас под собой, во-вторых, идеальный ход и, по настоящему программистский, если вы изначально разработаете модульную структуру вашего проекта, при которой к основному ядру можно будет поэтапно "цеплять" готовые модули, наращивая и увеличивая ваш чат.

Попутно стоит решить вопрос с администрированием, вернее с модераторством (если у вас, конечно, нет желания стать второй кроваткой). Для чего, скорее всего, придется строить иерархическую структуру статусов (сами-то вы вряд ли будете 24 часа в сутки следить за порядком). Тем более, что наличие статусов придает некую привлекательность серверу и стимулирует пользовательскую активность. Далее, если вы решили не ограничивать себя только парой-тройкой окон в чате с полем ввода и общим окном, то должен быть проработан механизм свзяывания чего-то "дополнительного" (я уж не знаю, что вам там взбредет в голову - виртуальное казино или просто сервер рассылки поздравительных открыток). Нужно всегда помнить, что основа всего - ЧАТ-СЕРВЕР. Иначе вы рискуете лишится определенного количества пользователей - часть совсем уйдет искать удачу на зеленом сукне вашего казино, часть просто будет перекладывать ваши поздравительные открытки. Поэтому и связывайте все это соответственно. Можно поступить весьма неоригинально, применив стандартный человеческий подход. Догадались, какой? :-)) Да просто взять и ввести национальную валюту, прочно привязанную к чат-серверу. Можете ее накручивать за проведенное время в чате или ею жалование администраторам выдавать - вариантов море. Заодно и игра в казино приобретет по настоящему азартный характер, да и открытки перестанут быть "халявными".

Чтобы не пропали труды предыдущей статьи даром, сразу займемся интеграцией проделанного в уже работающий чат.

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

<%
 Session("login")=request("userName")
 'приняли значение пароля при входе
 Session("Password")=request("userPassword")
 if  Session("dooropen")=0 then
 

'далее открываем базу данных с пользователями 
'и ищем там требуемого пользователя    
   set DB=Server.CreateObject("ADODB.Connection")
   DB.Open "users"
   sqlQuery="SELECT * FROM users "
   set rsQuery=DB.Execute(sqlQuery)
    Do While Not rsQuery.EOF
     if rsQuery("Login")=Session("login") Then
      if rsQuery("Password")=Session("Password") then
'если совпадают введенные логин и 
'пароль то разрешаем доступ
       AcessLogin=1
'записываем в Session-переменные 
'необходимые данные о пользователе            
        Session("color") = rsQuery("color")
        Session("gender") =rsQuery("Gender")
       end if 
     End If  
      rsQuery.MoveNext
     Loop
     rsQuery.Close
 
Session("Acess")=AcessLogin   
 if Session("Acess")<>0 then
 
    Session("dooropen")=1
       
     dim NewMess()
     Redim NewMess(20)
     
     messArray=Application("MessageArray")
     
     NewUser=Application("UsersArray")
     GUser = Application("GenderArray")
      for i=0 to 19
       NewMess(i+1) = messArray(i) 
      next
      
      for i=0 to 49
       if NewUser(i)="" then
        NewUser(i)=Session("login")
        GUser(i)=Session("gender")
        i=99
       end if  
      next
      
      NewMess(0)=Session("Login") & "снова с нами..."
       Application.Lock
        Application("MessageArray")=NewMess
        Application("UsersArray")=NewUser
        Application("GenderArray")=GUser
       Application.UnLock 
       
 else
   Response.Write "в доступе отказано"    
 end if
end if 
  %>

Ну вот, теперь для того чтобы войти пользователь должен быть зарегистрированным и вводить свои логин и пароль (в принципе, можете и оставить вход для так называемого гвеста, т.е. незарегистрированного пользователя). Далее...

Раз уж мы предложили пользователю выбирать цвет его сообщений при регистрации, то, наверное, стоит сделать так, чтобы его сообщения появлялись на экране именно с этим цветом. Для этого нам стоит немного добавить в исходный код chatinput.asp.

  <form method=post action=chatinput.asp 
  target=_self name=mForm>
   <Select Name=Type>
    <Option Value=Phrase>сказать</option>
    <Option Value=Action>сделать</option>
   </Select>
  <input type=text size=39 maxlength=255 name=mess>
  <input type=submit value="   Ok   ">
 </form> 
 
 <% 
 
 If (Request("mess") <>"" then
         
       Messa = "<font color="&Session(color) &">"&  
       Session("Login") & ": " & Request("mess")&"</font>"
       
       if Request("Type")="Action" then
        Messa="<i>" & Messa & "</i>"
       end if
      
     dim NewMess()
     Redim NewMess(20)
     messArray=Application("MessageArray")
      for i=0 to 19
       NewMess(i+1) = messArray(i) 
      next
      NewMess(0)= Messa
       Application.Lock
        Application("MessageArray")=NewMess
       Application.UnLock 
    
 end if
 %>

Всего лишь одна строчка, но сколько вострога :-))...

Теперь, я думаю, пора взяться и за chatuser.asp. Во-первых, стоит предусмотреть возможность предосмотра информации о каждом пользователе остальными, а во-вторых, неплохо было бы сделать некоторое различие по половому признаку, раз уж он у нас есть в базе. Для этого предлагаю для начала каждому пользователю в списке рисовать картинку в зависимости от его пола, которая в то же время будет ссылкой на информацию об этом пользователе (не мудурствуя лукаво - <img src="man.jpg"> и <img src="woman.jpg">).

 <html>
  <meta http-equiv="Refresh" content="45">
  <meta http-equiv="Content-Type" content="text/html; 
  charset=windows-1251"> 
  <body>
  <table cellpadding=5 cellspacing=5 border=0> 
   <%
    User=Application("UsersArray")
    Gender=Application("GenderArray")
    for i=0 to 49 
     if User(i)<>"" then
      if Gender(i)='Female' then
       image='woman.jpg'
      else  
       image='man.jpg'
      end if
       
       Response.write "<tr><td>"&User(i) & "</td>"
       Response.write "<td>"& "<a 
       href=infouser.asp?user=<%=User(i)%>& target=_new> 
       <img src=<%=image%>  border=0></a>" 
       &"</td></tr>" 
     end if
    next
   %>
   
  </body>
 </html>

Для того что бы и новый chat.asp и новый chatuser.asp были работоспособными, конечно же нужно добавить в global.asa объявление новoго общедоступного массива GenderUser:


  dim GArray()
  Redim GArray(50)
  Application("GenderArray")=GArray

Теперь наш список пользователей дополнился картинками, несущими в себе информацию о том, мальчик это или девочка (кстати, пользователь при регистрации может заполнить и любой другой пол - так что можно ввести и третью картинку), а так же появилась возможность посмотреть информацию об этих мальчиках и девочках. Или еще не появилась? Действительно, не хватает файла infouser.asp. Если чего-то не хватает, то это или нужно срочно найти или создать самому. Предлагаю второе:


<html>
 <body>  
  <% user = request("user")
   
   set DB=Server.CreateObject("ADODB.Connection")
   DB.Open "users"
   sqlQuery="SELECT * FROM users WHERE Login='"& user &"'""
   set rsQuery=DB.Execute(sqlQuery)
        login=rsQuery("Login")
        gender= rsQuery("Gender")
        color = rsQuery("color")
   rsQuery.Close
 
 %>
 информация о пользователе:<br><br>
  Имя: <%=login%><br>
  Пол: <%=gender%><br>
  Цвет: <font color=<%=color%>> 
  <%=color%> </font> <br>
 </body> 
</html>

Ну, пожалуй, на сегодня все...

Продолжение следует...



 Распечатать »
 Правила публикации »
  Написать редактору 
 Рекомендовать » Дата публикации: 23.03.2007 
 

Магазин программного обеспечения   WWW.ITSHOP.RU
Microsoft 365 Business Standard (corporate)
Microsoft Windows Professional 10, Электронный ключ
Microsoft Office 365 для Дома 32-bit/x64. 5 ПК/Mac + 5 Планшетов + 5 Телефонов. Подписка на 1 год.
Microsoft Office 365 Профессиональный Плюс. Подписка на 1 рабочее место на 1 год
Microsoft 365 Apps for business (corporate)
 
Другие предложения...
 
Курсы обучения   WWW.ITSHOP.RU
 
Другие предложения...
 
Магазин сертификационных экзаменов   WWW.ITSHOP.RU
 
Другие предложения...
 
3D Принтеры | 3D Печать   WWW.ITSHOP.RU
 
Другие предложения...
 
Новости по теме
 
Рассылки Subscribe.ru
Информационные технологии: CASE, RAD, ERP, OLAP
Безопасность компьютерных сетей и защита информации
Новости ITShop.ru - ПО, книги, документация, курсы обучения
Программирование на Microsoft Access
CASE-технологии
Мастерская программиста
Работа в Windows и новости компании Microsoft
 
Статьи по теме
 
Новинки каталога Download
 
Исходники
 
Документация
 
 



    
rambler's top100 Rambler's Top100