Чат на ASP: от простого к сложному.
Автор: Олег Яцура

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

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

 <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-переменная 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
 
 %>

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

 

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

К чему это я? Да к тому, что пора создавать список пользователей, находящихся на нашем чат-сервере, и отображать их список в отдельном окне.

В первую очередь нам нужно создать еще один общедоступный массив под этот самый список пользователей (по типу Application("MessageArray")). Для этого изменим файл global.asa:

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

 dim UserArray()  
 Redim UserArray(50) 
 Application("UsersArray")=UserArray 

End Sub 

Мы с вами только что добавили еще один массив UsersArray размерностью 50. Почему именно 50? Хм, можете сделать и 100. Но вряд ли у вас одновременно будут находиться 100 пользователей, а вот резвость своему серверу вы подобными "щедрыми" объявлениями поубавите.

 

Дальше нам нужно изменить наш "родительский" chat.asp:

  <frameset rows="*,68">
   <frameset cols="*,190"  border=0>   
     <frame src="chatbody.asp" name=bod scrolling="yes">
     <frame src="chatuser.asp" name=usr scrolling="yes">
   </frameset>
    <frame src="chatinput.asp" name=menu scrolling="no">
  </frameset> 

  <%
  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")
     
     NewUser=Application("UsersArray")
          
      for i=0 to 19
       NewMess(i+1) = messArray(i) 
      next
      
      for i=0 to 49
       if NewUser(i)="" then
        NewUser(i)=Session("login")
        i=99
       end if  
      next
      
      NewMess(0)=Session("Login") & "снова с нами..."
       Application.Lock
        Application("MessageArray")=NewMess
        Application("UsersArray")=NewUser
       Application.UnLock 
    
    end if     

  %>

Итак, что мы сделали?

Теперь давайте займемся самим списком в том виде, в каком его увидят пользователи, т.е. создадим chatuser.asp:

  
 <html>
  <meta http-equiv="Refresh" content="45">
  <meta http-equiv="Content-Type" content="text/html; charset=windows-1251"> 
  <body>
   
   <%
    User=Application("UsersArray")
    for i=0 to 49
     if User(i)<>"" then
      Response.write User(i) & "<br>"     
     end if
    next
   %>
   
  </body>
 </html> 

Ну вот почти и все. За исключением, разве того, что через некоторое время (как я вас не убеждал в обратном) вам не хватит 50 пользователей, отведенных в списке UsersArray... :-)). Для устранения сего недоразумения следует еще раз обратиться к файлу global.asa и добавить туда (наконец-то) процедуру Stssion_OnEnd:

 Sub Session_OnEnd 
  users=Application("UsersArray")
  mess=Application("MessageArray")
   for i=0 to 49
    if users(i)=Sessoin("Login") then
     users(i) =""
     
      dim NewMess()
      Redim NewMess(20)
      
       for i=0 to 19
        NewMess(i+1) = messArray(i) 
       next
       
     NewMess(0)=Session("Login") & "покинул нас..."
       Application.Lock
        Application("MessageArray")=NewMess
        Application("UsersArray")=users
       Application.UnLock 
    
     i=99
    end if
   next
 End sub  

Тем самым мы после прекращения сессии удалили ушедшего пользователя из списка и записали в общедоступный массив с фразами сообщение о его выходе.

Источник: www.relib.com

<Назад>
<Sub Main> <Download Centre> <Guest Book & Forum> <Contact Info> <Add Links>

Изучи все сам !
У нас  вы всегда найдете: методические указания по самостоятельному освоению популярных компьютерных программ, обучающие программы, документацию для новичков. http://shevcenco.da.ru