|
|||||||||
Автор: Nikolaev Dmitry Здесь будет приведен простейший чат, который не претендует ни на какую крутость
или что-то подобное, откровенно говоря, это - сырой материал, пример и всё. "<META HTTP-EQUIV=\"refresh\" CONTENT=\"10\""файла chat1.cgi просто впишите требуемое кол-во секунд. Также нада сделать ещё одно замечание. Оно касается CGI.pm. Когда пользователь посылает форму, элементы управления которой содержат данные, а ваш сценарий возвращает её без изменений, то CGI.pm копирует данные из старых элементов управления в новые. Друними словами, предположим, что форма включает текстовую область: $co->textarea( -name=>'textarea', -default=>'', -rows=>4, -columns=>40);Если пользователь вводит текст, а затем передаёт его сценарию, тот может прочитать данные стандартными CGI-методами. однако, когда вы возвращаете Web-страницу с аналогичной формой, CGI.pm восстанавливает в текстовой области исходный текст(даже, если в качестве текста по умолчанию задана пустая строка). В приложении результат будет таков: когда пользователь отсылает набранный текст, он воспринимается сценарием, но не исчезает из текстовой области. Чтобы CGI.pm обновлял элементы управления значениями по умолчанию, атрибут -override нужно установить в значение "истина": $co->textarea( -name=>'textarea', -default=>'', -override=>1, -rows=>4, -columns=>40);Теперь текстовая область будет очищаться после ввода данных, к чему, собственно, мы и стремились. Далее приведу тексты chat.htm, chat1.cgi, chat2.cgi <HTML> <HEAD> <TITLE>CHAT</TITLE> <FRAMESET ROWS="*,150"> <NOFRAMES>Извините, но для просмотра страницы вам нужна поддержка Фреймов вашим броузером</NOFRAMES> <FRAME NAME="_display" SRC="chat1.pl"> <FRAME NAME="_data" SRC="chat2.pl"> </FRAMESET> </HTML> #!/usr/bin/perl #chat1.cgi use CGI; $co=new CGI; open(DATA1,"chat1.dat") or die "Could not open Data file"; lockfile(DATA1); $text1= unlockfile(DATA1); close(DATA1); open(DATA2,"chat2.dat") or die "Could not open Data file"; lockfile(DATA2); $text2= unlockfile(DATA2); close(DATA2); $co->header, " ", $co->start_html( -title=>'Chat Example', -target=>'_display', -BGCOLOR=>'white'), $co->center($co->h1('Многопользовательский Чат')), $co->p,$co->p, $co->center($text1), $co->p, $co->center($text2), $co->end_html; sub lockfile { my $attemps=0; my $handle=shift; until (flock($handle,2)){ sleep . 10; if(++$count > 50){ $co->header, "<meta HTTP-EQUIV=\"refresh\" CONTENT=\"10\">", $co->start_html( -title=>'Chat Example', -target=>'_display', -BGCOLOR=>'white'), print "<center><h1><font color=red>Сервер занят. Попробуйте позже.</font></h1></center>"; exit; } } } sub unlockfile { my $handle=shift; flock($handle,8); } #!/usr/bin/perl #chat2.cgi use CGI; $co=new CGI; if($co->param()){ $name=$co->param('username'); $name=~ s/< ; $text=$co->param('textarea'); $text=~ s/< ; if ($text){ open(OLDDATA,">>chat2.dat") or die "Could not open Data file"; lockfile(OLDDATA); $oldtext= unlockfile(OLDDATA); close(OLDDATA); open(DATA,">>chat1.dat") or die "Could not open Data file"; lockfile(DATA); print DATA $oldtext; unlockfile(DATA); close(DATA); open(NEWDATA,">>chat2.dat") or die "Could not open Data file"; lockfile(NEWDATA); print NEWDATA "<B>", $name, ": ", "</B>",$text,"<br>"; unlockfile(NEWDATA); close(NEWDATA);}} &printpage; sub printpage{ $co->header, $co->start_html( -title=>'Chat Example', -BGCOLOR=>'white'), $co->startform, $co->center( "Введите ваше имя", $co->textfield(-name=>'username', -default=>'', -override=>1), "и введите сообщение<br>", $co->textarea( -name=>'textarea', -default=>'', -override=>1, -rows=>4, -columns=>40)), $co->center( $co->submit(-value=>'Сказать'), $co->reset), $co->endform, $co->end_html;} sub lockfile { my $attemps=0; my $handle=shift; until (flock($handle,2)){ sleep . 10; if(++$count > 50){ $co->header, "<meta HTTP-EQUIV=\"refresh\" CONTENT=\"10\">", $co->start_html( -title=>'Chat Example', -target=>'_display', -BGCOLOR=>'white'), print "<center><h1><font color=red>Сервер занят. Попробуйте позже.</font></h1></center>"; exit; } } } sub unlockfile { my $handle=shift; flock($handle,8); } Пример работы программы: Посмотреть При составлении статьи использовалась книга Стивена Холзнера "Perl. Специальный справочник" Автор: Nikolaev Dmitry
|
|||||||||
![]() |
![]() |