Практические примеры программирования cgi-скриптов на Perl: чат.
Чат.
Написание чата ничем особенным не отличается. Та же запись в файлы, чтение из них информации и вывод ее на экран. Однако
есть кое-какие тонкости. Сообщения в чат поступают в режиме реального времени, поэтому для поддержания этого режима
необходимо периодически обновлять содержимое html-страницы. Это осуществляется с помощью мета-инструкции <meta http2-equiv="Refresh" content="10"> .В данном случае будем обновлять страницу с интервалом в 10
секунд, этого вполне достаточно.
Итак, приступим непосредственно к чату. Для удобства, разобьем его как и форум на части и рассмотрим каждую в отдельности.
- Вход в чат ( http://webscript.ru/#ex1 )
- Добавление сообщения ( http://webscript.ru/#ex2 )
- Выход из чата ( http://webscript.ru/#ex3 )
- Отображение гостей чата,присутствующих в данный момент в онлайне ( http://webscript.ru/#ex4 )
- Вывод системного журнала ( http://webscript.ru/#ex5 )
- Вывод сообщений ( http://webscript.ru/#ex6 )
- Главная страница ( http://webscript.ru/#ex7 )
Сгенерируем форму для входа в чат.
<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";
$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);
open (LOG,"$syslog");
@strings=<LOG>;
$count=@strings;
close (LOG);
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.
|