Forum Webscript.Ru
Программирование => Perl => Тема начата: Troum от 08 Августа 2005, 12:00:32
-
Решил разобраться с потоками и сокетами на перле на примере простой задачки:
сервер создает сокет, клиенты подлючаются, посылают некие сообщения. Сервер их ловит и выводит у себя в STDOUT. Пока получился следующий код:
server:
#!/usr/bin/perl -w
use strict;
use IO::Socket;
use threads;
$SIG{CHLD} = sub {wait ()};
sub listener {
my $client = shift;
while (defined (my $buf = <$client>)) {
print $buf;
}
}
my $server = new IO::Socket::INET (LocalHost => \'localhost\',
LocalPort => 5000,
Proto => \'tcp\',
Listen => SOMAXCONN,
Reuse => 100
);
die "Server could not be created. Reason: $!" unless $server;
print "Server started\\n";
while (my $client = $server->accept()) {
print "New client registered\\n";
my $th = threads->create("listener", $client);
$th->join;
}
close ($server);
client:
#!/usr/bin/perl -w
use strict;
use IO::Socket;
my $client = IO::Socket::INET->new("localhost:5000");
die "Client could not be created. Reason: $!" unless $client;
while (<>) {
print $client $_;
}
close ($client);
В связи с этим есть два вопроса:
1. Пока сервер может получать сообщения только от одного клиента. Другой клиент подключается только если прибить первого. Как их заставить работать одновременно
2. Как сделать, чтоб сервер мог тоже отправлять сообщения в выходной поток клиета (эхо)?
Заранее спасибо за помощь
-
форкать, perldoc perlipc
-
А я научился форкать. Написал следующее:
#!/usr/bin/perl -w
use strict "vars";
use IO::Socket;
my $server = IO::Socket::INET->new
( LocalPort => 9911,
Type => \'tcp\',
Reuse => 1,
Listen => 10
)
or die $!;
sub serve
{ my $client = shift;
my $html = "HTTP/1.0 200 OK\\nContent-type: text/html\\n\\n200 OK\\n";
print $client $html;
for (1..50)
{ my $mes = "$_ at ".time."
\\n";
print $client $mes;
sleep 1;
}
}
while (my $client = $server->accept)
{ fork and next;
serve $client;
exit;
}
close $server;
Но у меня теперь другая проблема. Я хочу написать "потоковый" чат, как на mpchat.com. У них сообщения добавляются в окно лога (на экран) по ходу поступления, и когда я пользуюсь ихнем чатом сообщения (любой длины) сразу появляются у меня на экране, а когда я открываю свой скрипт (см. выше) данные почему-то буферизуются Интернет Эксплорером. То есть маленькое сообщение появляется только после того как прийдет достаточное количество других маленьких сообщений (тогда они все появятся одновременно, причем последнее будет откусано в конце; откусаный хвост появится со следующей партией). Хотя сегодня я переустанавил операционную систему (поставил Win2k Pro En) и эта проблема исчезла. Но все-таки, как решить проблему у тех юзверей у которых драгая ОС (с другой версией MSIE)?
Ещё вопрос. Говорят что максимальное количество прослушиваемых клиентов ограничено десятью. То есть я так понял что больше чем Listen => 10 не сделаешь. Или я ошибаюсь? Mpchat.com обслуживает сотни клиентов; как это сделать?
И ещё один вопрос. На mpchat.com адрес скрипта выдающего сообщения имеет примерно такой вид: http://mpchat.com/amod?963c4c44358. А у меня получилось http://localhost:9911. Как мне сделать так как у них?
-
Да, забыл сказать что про форки лучше читать в perlfork. Там сказано про важные моменты, про которые ничего не говорится в perlipc.