<% ASP на блюдечке %>. Часть 9
Чат своими силами
Без всего может обойтись
человек, но только не без человека.
Людвиг Берне
Обзор основ работы с файлами с помощью ASP
Несколько методов открытия и создания файлов
Вход в чат (файл Entrance.asp)
Просмотр списка сообщений чата (файл Text.asp)
Посылка сообщения в чат (файл Chat.asp)
Показ псевдонимов (кто в чате) — файл Nicks.asp
Заполнение пустых файлов (файл global.asa)
Введение
Развивая тему Интернет-общения, нельзя обойти стороной такой небезынтересный ее компонент, как чат. Согласитесь, что тема актуальна, и именно поэтому в настоящей статье мы продолжим обучение навыкам построения таких систем и освоим процесс создания еще одной из них, реализуя такой компонент, как чат.
Итак, настоящая статья адресована тем читателям, которые хотели бы самостоятельно разработать собственную чат-систему с нуля.
Кроме того, в данной статье детально рассмотрены операции над файлами, выполняемые с помощью ASP. Сделано это умышленно, для того чтобы предложить читателям освоить и этот, прежде незнакомый нам раздел ASP-программирования.
Что же такое чат?
Настоятельно рекомендую вам задаться этим вопросом, прежде чем продолжать чтение настоящей статьи.
Как наверняка известно многим, чат — это некая область окна браузера, в которой пользователи могут просматривать текстовые сообщения других пользователей и добавлять свои. Поток сообщений общий, поэтому сообщение, введенное любым пользователем, доступно для всех (хотя существуют чат-системы с возможностью «уединенной» беседы, то есть когда часть сообщений адресована какому-то конкретному пользователю и для остальных пользователей недоступна).
Таким образом, чат представляет собой одномерный поток текстовых сообщений (в отличие от форума, который является двухмерным потоком текстовых сообщений).
Теперь, когда картина нам в общем ясна, предлагаю разобраться с функционалом чат-систем, который, как правило, состоит из следующих функциональных компонентов:
- во-первых, это система идентификации пользователей. Данная система призвана регистрировать имя (псевдоним, nickname), пароль, электронный адрес и т.д. пользователя для обеспечения его уникальности в чат-системе;
- во-вторых, это, собственно, система представления общего потока текстовых сообщений, позволяющая пользователям просматривать поток текстовых сообщений;
- в-третьих, это система ввода сообщений, формирующая новые сообщения и вставляющая их в общий поток;
- в-четвертых, это система самообновления сообщений с задаваемым определенным интервалом времени.
Этот список можно продолжать, однако, чтобы не усложнять изложение материала, мы не будем этого делать в настоящей статье, а ограничимся лишь наиболее типичными требованиями.
Постановка задачи
С программной точки зрения чат-система должна представлять собой совокупность модулей, каждый из которых предназначен для решения одной из вышеизложенных задач. Таким образом, в состав наиболее типичной чат-системы входят:
- Модуль идентификации пользователей.
- Модуль представления потока сообщений всех пользователей.
- Модуль представления имен (псевдонимов) всех подключенных пользователей.
- Модуль формирования и ввода новых сообщений.
Что нам понадобится
В настоящей статье мы, как уже упоминалось, умышленно откажемся от всех своих знаний о базах данных и попробуем разработать файл-основанную систему, то есть будем хранить и обрабатывать всю информацию в файлах на нашем гипотетическом сервере, а заодно и изучим способы и методы работы с файлами средствами 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 |
Содержит значение кода типа устройства. |
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 & "] " 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> секунд </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>нет <INPUT type="radio" name="MsgIcon" value="10"><IMG SRC="Images/icon10.gif" alt="улыбка" HEIGHT=15 WIDTH=15 ALIGN=ABSCENTER> … <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