Forum Webscript.Ru

Программирование => Perl => Тема начата: Troum от 08 Августа 2005, 12:00:32

Название: Серверный скрипт для нескольких клиентов
Отправлено: 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. Как сделать, чтоб сервер мог тоже отправлять сообщения в выходной поток клиета (эхо)?

Заранее спасибо за помощь
Название: Серверный скрипт для нескольких клиентов
Отправлено: swop от 12 Августа 2005, 17:21:17
форкать, perldoc perlipc
Название: Серверный скрипт для нескольких клиентов
Отправлено: mind4 от 13 Августа 2005, 23:32:56
А я научился форкать. Написал следующее:

 
#!/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. Как мне сделать так как у них?
Название: Серверный скрипт для нескольких клиентов
Отправлено: mind4 от 14 Августа 2005, 00:06:05
Да, забыл сказать что про форки лучше читать в perlfork. Там сказано про важные моменты, про которые ничего не говорится в perlipc.