<% ASP на блюдечке %>. Часть 9

Чат своими силами

Без всего может обойтись человек, но только не без человека.
Людвиг Берне

Рубен Садоян

Введение

Что же такое чат?

Постановка задачи

Что нам понадобится

Обзор основ работы с файлами с помощью ASP

   Объект Folder

   Объект Drive

Несколько методов открытия и создания файлов

Структура приложения

   Вход в чат (файл Entrance.asp)

   Просмотр списка сообщений чата (файл Text.asp)

   Посылка сообщения в чат (файл Chat.asp)

   Показ псевдонимов (кто в чате) — файл Nicks.asp

   Немного об оформлении

   Заполнение пустых файлов (файл global.asa)

Заключение

Введение

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

Итак, настоящая статья адресована тем читателям, которые хотели бы самостоятельно разработать собственную чат-систему с нуля.

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

В начало

В начало

Что же такое чат?

Настоятельно рекомендую вам задаться этим вопросом, прежде чем продолжать чтение настоящей статьи.

Как наверняка известно многим, чат — это некая область окна браузера, в которой пользователи могут просматривать текстовые сообщения других пользователей и добавлять свои. Поток сообщений общий, поэтому сообщение, введенное любым пользователем, доступно для всех (хотя существуют чат-системы с возможностью «уединенной» беседы, то есть когда часть сообщений адресована какому-то конкретному пользователю и для остальных пользователей недоступна).

Таким образом, чат представляет собой одномерный поток текстовых сообщений (в отличие от форума, который является двухмерным потоком текстовых сообщений).

Теперь, когда картина нам в общем ясна, предлагаю разобраться с функционалом чат-систем, который, как правило, состоит из следующих функциональных компонентов:

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

Этот список можно продолжать, однако, чтобы не усложнять изложение материала, мы не будем этого делать в настоящей статье, а ограничимся лишь наиболее типичными требованиями.

В начало

В начало

Постановка задачи

С программной точки зрения чат-система должна представлять собой совокупность модулей, каждый из которых предназначен для решения одной из вышеизложенных задач. Таким образом, в состав наиболее типичной чат-системы входят:

  1. Модуль идентификации пользователей.
  2. Модуль представления потока сообщений всех пользователей.
  3. Модуль представления имен (псевдонимов) всех подключенных пользователей.
  4. Модуль формирования и ввода новых сообщений.
В начало

В начало

Что нам понадобится

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

В начало

В начало

Обзор основ работы с файлами с помощью ASP

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

Основу работы с файлами средствами ASP составляет ключевой метод объекта Server: Server.CreateObject (ObjectID).

Как мы знаем, метод CreateObject позволяет создавать экземпляры других объектов, предоставляя, таким образом, разработчикам доступ к их коллекциям, событиям, методам и свойствам.

Объектом, предоставляющим доступ к файловой системе на сервере, является объект FileSystemObject, позволяющий производить разнообразные операции над текстовыми файлами, папками, а также над логическими дисками посредством ASP-кода. Объект FileSystemObject является частью так называемого Scripting Object.

Для создания экземпляра объекта FileSystemObject необходимо выполнить следующую инструкцию:

var fso = Server.CreateObject("Scripting.FileSystemObject")
В начало

В начало

Объект Folder

Объект Folder позволяет осуществить доступ к файловой системе на указанном логическом диске. После создания экземпляра объекта FileSystemObject необходимо определить переменную, которая будет служить для хранения экземпляра объекта типа Folder и указывать на папку. Далее с помощью метода GetFolder следует извлечь содержимое нужной нам папки.

Каждый объект Folder имеет коллекцию Files, которая, по сути, представляет собой набор экземпляров объектов типа File.

Давайте рассмотрим следующий небольшой пример, служащий для построения списка всех файлов каталога "c:\inetpub\wwwroot":

var myPath = "c:\inetpub\wwwroot";
var fso = Server.CreateObject("Scripting.FileSystemObject");
var folder = fso.GetFolder(myPath);
var fileCollection = folder.Files;
var items = new Enumerator(fileCollection);

while (!items.atEnd()) {
i = items.item()
Response.write(i.name + " -- ");
Response.write(i.DateLastModified + "<br>");
items.moveNext();
}

Каждый объект типа File предоставляет доступ к свойствам файла, позволяет выполнять определенные манипуляции над файлами посредством своих методов:

 

Свойство

Описание

Attributes

Содержит атрибуты файла

DateCreated

Содержит дату и время создания файла

DateLastAccessed

Содержит дату и время последнего обращения к файлу

DateLastModified

Содержит дату и время последнего изменения файла

Drive

Содержит имя логического диска, на котором располагается файл

Name

Устанавливает или возвращает имя файла

Path

Содержит путь к файлу

Size

Содержит размер файла в байтах

Type

Содержит информацию о типе файла

Метод

Описание

Copy

Копирует указанный файл из одного места в другое

Move

Переносит указанный файл из одного места в другое

Delete

Удаляет указанный файл

В начало

В начало

Объект Drive

Объект FileSystemObject содержит свойство Drives, которое возвращает коллекцию всех объектов типа Drive, присутствующих в системе. Следующий код в качестве выхода генерирует список всех логических дисков и указывает их тип, а также метку тома:

var fso = Server.CreateObject("Scripting.FileSystemObject");
var drives = fso.drives;
var items = new Enumerator(drives);
while (!items.atEnd()) {
   i = items.item()
   Response.write("<tr>");
   Response.write("<td>" + i.DriveLetter + "</td>");
   Response.write("<td>" + i.DriveType + "</td>");
   Response.write("<td>" + i.VolumeName + "</td>");
   Response.write("<tr>");
   items.moveNext();
}

Каждый экземпляр (item) коллекции Drives является объектом типа Drive. Рассмотрим свойства и методы последнего:

 

Свойство

Описание

AvailableSpace

Содержит информацию о доступном дисковом пространстве

DriveLetter

Содержит букву логического диска.

Drive Type

Содержит значение кода типа устройства.
0 — Неизвестное устройство
1 — Съемное устройство
2 — Жесткий диск
3 — Сеть
4 — Cd-Rom
5 — RAM-диск

FileSystem

Возвращает идентификатор типа файловой системы носителя

FreeSpace

Содержит информацию о свободном дисковом пространстве

IsReady

Логическая переменная, определяющая готовность устройства

Path

Содержит путь к логическому устройству

RootFolder

Возвращает объект типа Folder, являющийся корневой папкой устройства

Serial Number

Возвращает уникальный серийный номер устройства в десятичном формате

ShareName

Возвращает имя «разделенного» сетевого ресурса

TotalSize

Содержит информацию о полном дисковом пространстве (в байтах)

VolumeName

Содержит метку тома устройства

Конец формы

В начало

В начало

Несколько методов открытия и создания файлов

Метод OpenTextFile — открывает указанный файл и возвращает объект типа TextStream, который может быть использован для перезаписи, для добавления в файл или для чтения из файла. Синтаксис:

объект.OpenTextFile(Имя[, Режим[, Создание[, Формат]]])

Объект — имя экземпляра объекта типа FileSystemObject.

Имя — строка текста с указанием имени файла.

Режим — указывает на режим открытия (создания) файла. Возможные значения (для записи, для чтения и для добавления):

 

Константа

Значение

Описание

ForReading

1

Файл открывается только для чтения. Запись невозможна

ForWriting

2

Файл открывается только для записи. Чтение невозможно

ForAppending

8

Файл открывается только для записи в конец

Создание — булево выражение, указывающее на необходимость записи нового файла, в случае если файл с указанным именем не существует: True — файл будет создан; False — файл не будет создан.

Формат — определяет формат открываемого файла и может принимать одно из следующих значений:

 

Константа

Значение

Описание

TristateUseDefault

-2

Открыть файл в системном формате по умолчанию

TristateTrue

-1

Открыть файл в режиме Unicode

TristateFalse

0

Открыть файл в режиме ASCII

Приведем пример использования функции OpenTextFile для записи в файл:

Sub OpenTextFileTest
   Const ForReading = 1, ForWriting = 2, ForAppending = 8
   Dim fso, f
   Set fso = CreateObject("Scripting.FileSystemObject")
   Set f = fso.OpenTextFile("c:\test.txt", ForWriting, True)
   f.Write "Всем привет!"
   f.Close
End Sub

Метод CreateTextFile — служит для создания указанного файла и возвращает TextStream-объект, используемый для чтения из файла или записи в файл. Синтаксис:

объект.CreateTextFile(Имя[, Перезапись[, unicode]])

Объект — имя экземпляра объекта типа FileSystemObject.

Имя — строка текста с указанием имени файла.

Перезапись — булево выражение, указывающее на то, будет ли осуществлена перезапись файла: True — перезапись разрешена; False — перезапись запрещена.
unicode — булево выражение, указывающее режим создания файла: True — создаваемый файл формата Unicode; False — создаваемый файл формата ASCII (по умолчанию).

Приведем пример использования функции CreateTextFile для создания файла:

Sub CreateAfile
   Dim fso, MyFile
   Set fso = CreateObject("Scripting.FileSystemObject")
   Set MyFile = fso.CreateTextFile("c:\testfile.txt", True)
   MyFile.WriteLine("Строка текста…")
   MyFile.Close
End Sub

Заметьте, что если параметр Перезапись выставлен в False или не указан, либо если файл с указанным в функции именем уже существует, то произойдет ошибка.

Метод GetFile — служит для извлечения объекта типа File, соответствующего файлу, указанному в качестве параметра:

объект.GetFile(Путь)

Объект — имя экземпляра объекта типа FileSystemObject.

Путь — абсолютный или относительный путь к файлу.

Если указанный файл не существует, то происходит ошибка.

Приведем пример использования функции GetFile для извлечения информации о файле:

Function ShowFileAccessInfo(filespec)
   Dim fso, f, s
   Set fso = CreateObject("Scripting.FileSystemObject")
   Set f = fso.GetFile(filespec)
   s = f.Path & "<br>"
   s = s & "Created: " & f.DateCreated & "<br>"
   s = s & "Last Accessed: " & f.DateLastAccessed & "<br>"
   s = s & "Last Modified: " & f.DateLastModified   
   ShowFileAccessInfo = s
End Function

Теперь, когда мы приобрели навыки обработки файлов, папок и логических устройств, можно переходить к созданию самой чат-системы.

В начало

В начало

Структура приложения

Однако прежде чем приступать к созданию файл-основанного чата, давайте представим себе, каким же образом будет осуществляться обмен сообщениями — ведь в качестве носителя данных у нас выступает не база данных, а файлы на жестком диске сервера. Да очень просто: все текстовые сообщения, предварительно обрамленные в необходимые HTML-тэги форматирования, будут «складываться» в отдельный файл (назовем его файлом чат-сообщений «Chat.txt»), после чего будет генерироваться страница на основе этого файла, которая будет доступна всем пользователям нашего чата. Аналогичные действия необходимо проделать и со страницей псевдонимов, которая, в свою очередь, будет генерироваться на основании файла псевдонимов «Nicks.txt». Таким образом, файл nicks.txt будет содержать информацию о пользователях, находящихся в режиме онлайн. А выход того или иного пользователя из чата должен сопровождаться удалением его имени из файла псевдонимов.

В начало

В начало

Вход в чат (файл Entrance.asp)

Главная страница чата предназначена для выбора пользователем имени-псевдонима, указания им предпочтительного цвета имени, а также для нескольких настроек: количества одновременно отображаемых сообщений и времени обновления текстовой страницы в секундах.

После этого в файл с псевдонимами вносится соответствующее имя (предварительно проверяется его уникальность) и пользователь попадает в главное окно нашего чат-приложения.

<%
Iname = Trim (Request.Form("nickname"))

If iname = "" Then
   msg = "Использование пробелов в псевдониме недопустимо!"
Else

If InStr(iname,"<") < 1 Then
   Dim FileObject, InStream

'Создаем экземпляр объекта типа FileSystemObject
   Set FileObject = CreateObject("Scripting.FileSystemObject")
'Присоединяемся к пути /Chat/Nicks.txt
   NicksFile = Server.MapPath("/Chat/Nicks.txt")

   Set InStream = FileObject.OpenTextFile(NicksFile, 1, false)
'Открываем файл   
   Do While Not InStream.AtEndOfStream

    Line = InStream.ReadLine()
    If Trim (Line) = Iname Then   ' Nick has been used
      IsError = True
      msg = "<font color='red'>Повтор псевдонимов недопустим. Введите другой псевдоним.</font>"
      Exit Do
    End If
    On Error Resume Next
    InStream.SkipLine()
   Loop

   Set InStream = Nothing

   If Not IsError Then
    Set FileObject = CreateObject("Scripting.FileSystemObject")
    NicksFile = Server.MapPath("/Chat/Nicks.txt")   
    Set OutStream = FileObject.OpenTextFile(NicksFile, 8, true)
    OutStream.WriteLine (Iname)
    OutStream.WriteLine (Iname)
    Set OutStream = Nothing

    IsError = False
    Session("UserName") = Iname
    Session("UserColor") = Request("user_color")
    Session("RefreshTime") = Request("RefreshTime")
    Session("LNum") = Request("LNum")

    Set FileObject = Server.CreateObject("Scripting.FileSystemObject")
    TFile = Server.MapPath ("/Chat/Chat.txt")
    Set InStream = FileObject.OpenTextFile (TFile, 1, False )

    FileContents = Trim(InStream.ReadALL)

    TextStr = "<table><tr><td><B><font color='" & Session("UserColor") &_
                   "'>" & Session("UserName") & "</font></B>" &_
                   " : " & "вошел в чат - " & date & " " & time & "</td></tr></table>"

    Set OutStream = FileObject.CreateTextFile (TFile, True)
    OutStream.WriteLine(TextStr)
    OutStream.WriteLine(FileContents)

    Set OutStream = Nothing
    Set TextStr   = Nothing
    Set InStream = Nothing
    Set FileContents = Nothing

    Response.Redirect("MainFS.asp")

   End If
   IsError = false
End If
End If
%>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
</head>

<body>
<BR><BR><BR>

<center>
<font color="#000000" size=+2>Добро пожаловать в Чат</font>
</center>

<BR>
<center>
<p>Сейчас в чате:</p>

<table align= "center" width= 400 border = 0>
<tr><td align= "center">

<%
Set FileObject = Server.CreateObject("Scripting.FileSystemObject")
TestFile = Server.MapPath ("/Chat/Nicks.txt")

On Error Resume Next   
Set InStream = FileObject.OpenTextFile (TestFile, 1, False, False)

CurUser = 0
Odd = 0
NameNum = 0

Do While Not InStream.AtEndOfStream
    If Odd = 0 Then
      If NameNum = 10 Then
       Response.Write "</td></tr><tr><td align= 'center'>"
       NameNum = 0
      End If
      Str = InStream.ReadLine()
      If Str <> "" Then
       Response.Write "[" & Str & "]&nbsp;"
       Odd = 1
       CurUser = CurUser + 1
       NameNum = NameNum + 1
      End If
    Else
      Odd = 0
      InStream.SkipLine()
    End If
Loop   

If CurUser = 0 Then
    Response.Write "нет пользователей"
Else
    Response.Write "</td></tr><tr><td align= 'center'>Всего " & CurUser
End If

Set Instream = Nothing

%>
</td></tr></table>
<br>

<Form name="Nickname" method="post" action="Entrance.asp">

<table width= 400 border = 1>

<tr>
   <td>Ваш псевдоним:</td>
   <td><input type=text name="nickname" value=""></td>
</tr>

<tr>
   <td valign="top">Ваш цвет:</td>
   <td>
   <FONT FACE="arial, verdana, helvetica" SIZE="2">

…
<INPUT TYPE="radio" NAME="user_color" VALUE="#0000FF"> <FONT COLOR="#0000FF">Текст<BR>
…
</FONT>
   </td>
</tr>

<tr>
   <TD>Обновление чата:</TD>
   <TD><SELECT NAME="RefreshTime">
    <OPTION VALUE="5">5
    <OPTION VALUE="10">10
    <OPTION VALUE="15"Selected>15
    <OPTION VALUE="20">20
    <OPTION VALUE="30">30
    <OPTION VALUE="60">60
   </SELECT>&nbsp;секунд
   </TD>
</tr>

<tr>
<td>Просматриваемых сообщений:</td>
<td><INPUT TYPE="text" NAME="LNum" VALUE="30" SIZE="2" MAXLENGTH="2"></td>
</tr>

</table>
<br>
<input type=submit name="okbtn" value="Войти"
</Form>

<BR><H6><%=msg%><br>Использование HTML-тэгов недопустимо!</h6><BR>
</center>

</body>
</html>

Просмотреть полученную страницу входа в чат можно здесь.

В начало

В начало

Просмотр списка сообщений чата (файл Text.asp)

Теперь нам нужно разработать страничку, содержащую все пользовательские сообщения. Она по сути должна отображать содержимое соответствующего файла сообщений Chat.txt. Страничка должна самообновляться каждые Session("RefreshTime") секунд:

<html>
 <%
 Response. Write "<META http-equiv='refresh' content='" & CInt(Session("RefreshTime")) & "'>"
 %>
 
 <head>
 <meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
 </head>
 <body>
 
 <%
 Set FileObject = Server.CreateObject("Scripting.FileSystemObject")
 TestFile = Server.MapPath ("/Chat/Chat.txt")
 
 On Error Resume Next   
 Set InStream = FileObject.OpenTextFile (TestFile, 1, False, False)
 
 CurLine = 0
 MaxLines = CInt(Session("LNum"))
 
 Do While Not InStream.AtEndOfStream
     Response.Write InStream.ReadLine()
     CurLine = CurLine + 1
     If CurLine >= MaxLines Then Exit Do End If
 Loop   
 
 Response.Write "<br>"
 
 Set Instream = Nothing
 %>
 
 </body>
 </html>
В начало

В начало

Посылка сообщения в чат (файл Chat.asp)

Теперь нам потребуется страничка посылки сообщений в чат. Для этого понадобится HTML-форма с текстовым полем ввода сообщения, парой кнопок и «радиопереключателем» смайликов к сообщениям. Последние лежат в каталоге Images к исходникам настоящей статьи. После нажатия пользователем на кнопку «Сказать», необходимое сообщение, обрамленное соответствующими тэгами (цвет, смайлик) попадет в чат-файл.

<%
Session.TimeOut = 1

If Session("UserName") <> "" Then
    Response.Write "Пользователь: " & Session("UserName") & "<br>"
Else
    Response.Write "Вы покинули чат. <br>"
End If

If Request("go") = "Войти" Then
   Response.Redirect("Entrance.asp")
End If

If Request("exit") = "Выйти" Then
    Set FileObject = Server.CreateObject("Scripting.FileSystemObject")
    TestFile = Server.MapPath ("/Chat/Chat.txt")
    Set InStream= FileObject.OpenTextFile (TestFile, 1, false )

    FileContents = Trim(InStream.ReadALL)
    textstr = "<table><tr><td><b><font color='" & Session("UserColor") &_
                  "'>" & Session("UserName") & "</font></B> : " &_
                  "покинул чат - " & date & " " & time & "</td></tr></table>"

    Set OutStream= FileObject.CreateTextFile (TestFile, True)
    OutStream.WriteLine(textstr)
    OutStream.WriteLine(filecontents)

    Set OutStream = Nothing
    Set textstr   = Nothing
    Set Instream = Nothing
    Set filecontents = Nothing

    Set FileObject = Server.CreateObject("Scripting.FileSystemObject")
    TestFile = Server.MapPath ("/Chat/Nicks.txt")
    Set InStream = FileObject.OpenTextFile (TestFile, 1, false )

    ResultText = ""

    While InStream.AtEndOfStream <> True
    textstr = InStream.ReadLine
    If textstr <> Session("UserName") Then
      ResultText = ResultText & textstr & CHR(13) & CHR(10)
    End If
    WEnd

    Set f = FileObject.GetFile(TestFile)
    Set txtstream = f.OpenAsTextStream (2, -2)
    txtstream.Write ResultText
    txtstream.Close

    Set OutStream = Nothing
    Set textstr   = Nothing
    Set Instream = Nothing
    Set filecontents = Nothing

    Session("UserName") = ""
End If

%>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
</head>
<body>

<%
TextStr = Trim (Request.Form("txtbox"))

If InStr(TextStr, "<") < 1 Then
   If TextStr <> "" Then
      Set FileObject = Server.CreateObject("Scripting.FileSystemObject")
      TestFile = Server.MapPath ("/Chat/Chat.txt")
      On Error Resume Next
      Set InStream= FileObject.OpenTextFile (TestFile, 1, false )
      On Error Resume Next

      filecontents = Trim(InStream.ReadALL)

      Select Case CInt(Request.Form("MsgIcon"))
       Case 0
          ImageFileName = ""
       Case 7
          ImageFileName = "Images\icon7.gif"
       Case 2
          ImageFileName = "Images\icon2.gif"
       Case 3
          ImageFileName = "Images\icon3.gif"
       Case 4
          ImageFileName = "Images\icon4.gif"
       Case 5
          ImageFileName = "Images\icon5.gif"
       Case 6
          ImageFileName = "Images\icon6.gif"
       Case 8
          ImageFileName = "Images\icon8.gif"
       Case 9
          ImageFileName = "Images\icon9.gif"
       Case 10
          ImageFileName = "Images\icon10.gif"
       Case 11
          ImageFileName = "Images\icon11.gif"
       Case 12
          ImageFileName = "Images\icon12.gif"
       Case 13
          ImageFileName = "Images\icon13.gif"
       Case 14
          ImageFileName = "Images\icon14.gif"
      End Select

      TextStr = Replace(TextStr, vbCrLf, "<br>")

      If (ImageFileName <> "") Then
         TextStr = "<table><tr><td width=15 valign='top'><img src = '" & ImageFileName & "'></td>" &_
                         "<td width=70 valign='top'><B><font color = '" & Session("UserColor") &_
                         "'>" & Session("UserName") & "</td><td>" &_
                         "</font></B>" & " : " & TextStr & "</td></tr></table>"
      Else
         TextStr = "<table><tr><td width=15 valign='top'></td>" &_
                         "<td width=70 valign='top'><B><font color = '" & Session("UserColor") &_
                         "'>" & Session("UserName") & "</td><td>" &_
                         "</font></B>" & " : " & TextStr & "</td></tr></table>"
      End If

      Set OutStream = FileObject.CreateTextFile (TestFile, True)
      OutStream.WriteLine(textstr)
      OutStream.WriteLine(filecontents)

      Set OutStream = Nothing
      Set textstr = Nothing
      Set Instream = Nothing
      Set filecontents = Nothing

      Application("IsRefresh") = True

   End If
End If
%>

<FORM method="post" action="chat.asp">
<table>
<tr>
<td valign="top" align="right">
   <INPUT type="radio" name="MsgIcon" value="0" CHECKED>нет&nbsp;&nbsp;
   <INPUT type="radio" name="MsgIcon" value="10"><IMG SRC="Images/icon10.gif" alt="улыбка" HEIGHT=15 WIDTH=15 ALIGN=ABSCENTER>&nbsp;&nbsp;
…
<BR>
</td>
<td>
    <textarea cols="56" rows="5" Style="font: 8pt 'Verdana'" value="" name="txtbox"></textarea>
</td>

<td valign="top">
   <table><tr><td>

<% If Session("UserName") <> "" Then %>
    <Input type = Submit Style="font: 8pt 'Verdana'; Width: 55" value="Сказать" name="go">
    </td></tr><tr><td>
    <Input type = Submit Style="font: 8pt 'Verdana'; Width: 55" value="Выйти" name="exit">
    </form>
<% Else %>
    </form>
    <form method="post" action="chat.asp" target="_top">
      <Input type = Submit Style="font: 8pt 'Verdana'; Width: 55" value="Войти" name="go" >
    </form>
<% End If %>

   </td></tr></table>
</td>
</tr>
</table>
</body>
</html>

Как видите, все довольно просто, и в результате у нас получился инструмент ввода сообщений в чат. Нам осталось только разработать страничку, аналогичную Text.asp, но показывающую не текстовые сообщения, а список псевдонимов (кто в чате) и упорядочить все страницы проекта с помощью фреймов.

В начало

В начало

Показ псевдонимов (кто в чате) — файл Nicks.asp

Все делается аналогично страничке Text.asp: самообновление страницы, показ списка пользователей. Здесь нет ничего сложного, и нам необходимо просто извлечь из файла список имен-псевдонимов и показать его:

<html>
<%
Response. Write "<META http-equiv='refresh' content='" & CInt(Session("RefreshTime")) & "'>"
%>

<head>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251">
</head>
<body>

Сейчас в чате:<br>

<%
Set FileObject = Server.CreateObject("Scripting.FileSystemObject")
TestFile = Server.MapPath ("/Chat/Nicks.txt")

On Error Resume Next   
Set InStream = FileObject.OpenTextFile (TestFile, 1, False, False)

CurUser = 0
Odd = 0

Do While Not InStream.AtEndOfStream
    If Odd = 0 Then
      Str = InStream.ReadLine()
      If Str <> "" Then
       Response.Write "[" & Str & "]<br>"
       Odd = 1
       CurUser = CurUser + 1
      End If
    Else
      Odd = 0
      InStream.SkipLine()
    End If
Loop   

If CurUser = 0 Then
    Response.Write "<br>нет пользователей"
Else
    Response.Write "<br>Всего " & CurUser
End If

Set Instream = Nothing

%>

</body>
</html>
В начало

В начало

Немного об оформлении

Теперь нам надлежит оформить одну страницу из трех (Chat.asp, Nicks.asp и Text.asp) с помощью фреймов. Для начала создадим вертикальный фрейм:

<Frameset rows="80%,20%">
<frame name="textFrame" src="RightFS.asp">
<frame name="chatFrame" src="chat.asp">
</Frameset>

затем представим горизонтальный фрейм следующим образом:

<frameset cols="85%,15%" frameborder="YES" border="1" framespacing="0">
<frame name="mainFrame" src="text.asp">
<frame name="rightFrame" src="Nicks.asp">
</frameset>

Просмотреть полученную страницу можно здесь.

В начало

В начало

Заполнение пустых файлов (файл global.asa)

Теперь нужно сформировать файлы Chat.txt и Nicks.txt. Для удобства вставим код по их перезаписи в событие Application_OnStart, то есть фактически перезапись этих файлов будет выполняться каждый раз, когда будет стартовать IIS и когда первый пользователь обратится к странице нашего приложения. Как видите, здесь имеет место перезапись файлов с добавлением в каждый из них одной пустой строки (метод .WriteBlankLines(1)).

…
SUB Application_OnStart
   Set FileObject = Server.CreateObject("Scripting.FileSystemObject")
   TestFile = Server.MapPath ("/Chat/Chat.txt")
   Set OutStream = FileObject.CreateTextFile (TestFile, True)
   OutStream.WriteBlankLines(1)

   TestFile = Server.MapPath ("/Chat/Nicks.txt")
   Set OutStream = FileObject.CreateTextFile (TestFile, True)
   OutStream.WriteBlankLines(1)

   Set OutStream = Nothing
   Set FileObject = Nothing
END SUB
…
В начало

В начало

Заключение

В заключение хотелось бы остановиться на сильных и слабых сторонах рассмотренной нами чат-системы. Прежде всего, очевидное достоинство файл-основанной системы заключается как в простоте программного подхода, так и в организации хранения данных. Однако не стоит забывать о том, что данный пример намеренно создан с целью обучения работе с файлами средствами ASP и не предназначен на роль «двигателя» для реального, активно посещаемого чата, хотя и может быть использован в этом качестве в относительно небольших чат-приложениях. Другое дело, что реализованный на базе какой-нибудь СУБД чат будет работать несколько надежнее и быстрее, чем в данном случае, и его производительность будет в меньшей степени зависеть от транзакционной нагрузки на сервер. Еще одним вариантом построения чат-системы может служить хранение общего поля текста чата в какой-нибудь переменной ASP-приложения (в области видимости Application). Однако здесь также есть свои ограничения, зависящие от роста количества пользователей системы. Тем не менее автор настоящей статьи постарается рассмотреть все указанные варианты построения чат-систем в следующих статьях серии «ASP на блюдечке».

Полный архив исходных текстов ASP-страниц к настоящей статье лежит здесь.

 

С автором статьи можно связаться по следующему адресу: rouben@iname.com

КомпьютерПресс 5'2000

1999 1 2 3 4 5 6 7 8 9 10 11 12
2000 1 2 3 4 5 6 7 8 9 10 11 12
2001 1 2 3 4 5 6 7 8 9 10 11 12
2002 1 2 3 4 5 6 7 8 9 10 11 12
2003 1 2 3 4 5 6 7 8 9 10 11 12
2004 1 2 3 4 5 6 7 8 9 10 11 12
2005 1 2 3 4 5 6 7 8 9 10 11 12
2006 1 2 3 4 5 6 7 8 9 10 11 12
2007 1 2 3 4 5 6 7 8 9 10 11 12
2008 1 2 3 4 5 6 7 8 9 10 11 12
2009 1 2 3 4 5 6 7 8 9 10 11 12
2010 1 2 3 4 5 6 7 8 9 10 11 12
2011 1 2 3 4 5 6 7 8 9 10 11 12
2012 1 2 3 4 5 6 7 8 9 10 11 12
2013 1 2 3 4 5 6 7 8 9 10 11 12
Популярные статьи
КомпьютерПресс использует