Примеры программирования cgi-скриптов на Perl: чат
Чат
Написание чата ничем особенным не отличается. Та же запись в файлы, чтение из них информации и вывод ее на экран. Однако есть кое-какие тонкости. Сообщения в чат поступают в режиме реального времени, поэтому для поддержания этого режима необходимо периодически обновлять содержимое html-страницы. Это осуществляется с помощью мета-инструкции <meta http-equiv="Refresh" content="10"> .В данном случае будем обновлять страницу с интервалом в 10 секунд, этого вполне достаточно. Итак, приступим непосредственно к чату. Для удобства, разобьем его как и форум на части и рассмотрим каждую в отдельности.
- Вход в чат
- Добавление сообщения
- Выход из чата
- Отображение гостей чата,присутствующих в данный момент в онлайне
- Вывод системного журнала
- Вывод сообщений
- Главная страница
Вход в чат
Сгенерируем форму для входа в чат.
<html><style> BODY {background-color:#e6e8fa;font-family:arial;font-size:10pt;color:#000080;} </style> <body> <h3 align=center><font color="ff0000">Вход в чат.</font></h3> <form action="chat.cgi" method="GET"> <table align=center> <tr><td>Введите ваш ник:<td><input type="text" name="nick" size=20> <tr><td>Выберите цвет сообщений:<td><select name="color"> <option>black</option> <option>red</option> <option>blue</option> <option>green</option> <option>darkred</option> <option>yellow</option> </select> <tr><td colspan=2><input type="hidden" name="enter" value="1"> <tr><td colspan=2><input type="hidden" name="action" value="login"> <tr><td colspan=2><input type="submit" value="Enter"> </table></form></html>
Она будет иметь такой вид:
Вход в чат.
Посетитель выбирает себе ник и цвет, под которым будут выводиться его сообщения. Далее,скрипт получает эти данные и обрабатывает их.
#!/usr/local/bin/perl $request=$ENV{'REQUEST_METHOD'}; $content=$ENV{'CONTENT_LENGTH'}; $file="chat.txt"; # Файл для записи сообщений $syslog="log.txt"; # Cистемный журнал $online="online.txt"; # Файл для записи онлайновых посетителей. $dir="f:/usr/local/apache/cgi-bin"; $path="f:/usr/local/apache/cgi-bin/images/"; # Путь к папке с картинками (смайликами) # Назначаем переменные для смайликов. @images=("smile.gif","frown.gif","redface.gif","biggrin.gif","wink.gif", "tongue.gif","cool.gif","rolleyes.gif", "mad.gif","eek.gif","confused.gif"); $img0=$images[0]; $src0="$path$img0"; $img1=$images[1]; $src1="$path$img1"; $img2=$images[2]; $src2="$path$img2"; $img3=$images[3]; $src3="$path$img3"; $img4=$images[4]; $src4="$path$img4"; $img5=$images[5]; $src5="$path$img5"; $img6=$images[6]; $src6="$path$img6"; $img7=$images[7]; $src7="$path$img7"; $img8=$images[8]; $src8="$path$img8"; $img9=$images[9]; $src9="$path$img9"; $img10=$images[10]; $src10="$path$img10"; if ($request eq 'GET') { $query=$ENV{'QUERY_STRING'}; } else { sysread(STDIN,$query,$content); } # Функция для декодирования полей форм. @pairs = split(/&/, $query); foreach $pair (@pairs) { ($name, $value) = split(/=/, $pair); $name =~ tr/+/ /; $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $name =~ s///g; $name =~ s/<([^>]|n)*>//g; $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; $value =~ s///g; $value =~ s/</</g; $value =~ s/>/>/g; $value =~ s/n//g; $value =~ s/cM/ /g; $value =~ s/|/ /g; $value =~ tr/ / /s; $value =~ s/<([^>]|n)*>//g; $value =~ s/"/"/g; $value=~s/:)/<img src='$src0'>/g; $value=~s/:(/<img src='$src1'>/g; $value=~s/:o/<img src='$src2'>/g; $value=~s/:D/<img src='$src3'>/g; $value=~s/;)/<img src='$src4'>/g; $value=~s/:p/<img src='$src5'>/g; $value=~s/:cool:/<img src='$src6'>/g; $value=~s/:rolleyes:/<img src='$src7'>/g; $value=~s/:mad:/<img src='$src8'>/g; $value=~s/:eek:/<img src='$src9'>/g; $value=~s/:confused:/<img src='$src10'>/g; $input{$name} = $value; } #####################Вход в чат######################### ($action eq "login") && do { # Получаем переменные $enter=$input {'enter'}; $color=$input {'color'}; $nick=$input {'nick'}; $time=scalar localtime; if ($enter eq "1") { # Проверяем,ввел ли посетитель ник и если да то записываем в системный # журнал имя и время входа. if ($nick ne "") { open (LOG,">>$syslog"); $string="Системное сообщение:$nick вошел в чат $time"; print LOG "$stringn"; close (LOG); # Добавляем имя посетителя также в файл для показа онлайна. open (NET,">>$online"); print NET "$nickn"; close (NET); # Установим количество записей в журнале.Я выбрал их равным 10. open (LOG,"$syslog"); @strings=<LOG>; $count=@strings; close (LOG); # Если их количество больше 10,удаляем самую первую запись и перезаписываем журнал. if ($count>10) { shift (@strings); } open (LOG,">$syslog"); print LOG @strings; close (LOG); # Теперь посетитель находится в чате и может добавлять сообщения. # Генерируем форму. print "Content-type:text/htmlnn"; print <<HTML; <html><style> BODY {background-color:#e6e8fa;font-family:arial;font-size:10pt;color:#000080;} </style> <body> <center><h3>Здравствуйте,<font color="$color">$nick!</font></h3> Вы успешно вошли в чат. <br>Вы можете добавлять ваши сообщения.Ваш цвет-<font color="$color">$color</font>.</center> <form action="chat.cgi" method="GET"> <input type="hidden" name="action" value="add"> <input type="hidden" name="nick" value="$nick"> <input type="hidden" name="color" value="$color"> <input type="hidden" name="send" value="1"> <table align=center> <tr><td><textarea name="message" wrap="virtual" rows=5 cols=40></textarea> <td><input type="submit" value="Отправить"></form><p> <form action="chat.cgi" method="GET"> <input type="hidden" name="action" value="add"> <input type="hidden" name="nick" value="$nick"> <input type="submit" value="<<Выход>>"> </form> </table> HTML } # Если посетитель не ввел ник,выдается ошибка. else { print "Content-type:text/htmlnn"; print <<HTML; <html><style> BODY {background-color:#e6e8fa;font-family:arial;font-size:10pt;color:#000080;} </style> <body> <h3 align=center>Вы не ввели ник!</h3> Пожалуйста,вернитесь и введите ник. <p><center><a href="chat.cgi?action=login">Назад</a></center> HTML } }
Форма будет иметь следующий вид:
Здравствуйте, гость!
Вы успешно вошли в чат.Вы можете добавлять ваши сообщения.Ваш цвет-red.
Оставить комментарий
Комментарий: можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
| |