Автор Тема: Серверный скрипт для нескольких клиентов  (Прочитано 3373 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Troum

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 71
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Решил разобраться с потоками и сокетами на перле на примере простой задачки:
сервер создает сокет, клиенты подлючаются, посылают некие сообщения. Сервер их ловит и выводит у себя в 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

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 6
  • +0/-0
  • 0
    • Просмотр профиля
    • http://www.ppe-group.ru
Серверный скрипт для нескольких клиентов
« Ответ #1 : 12 Августа 2005, 17:21:17 »
форкать, perldoc perlipc

Оффлайн mind4

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 6
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Серверный скрипт для нескольких клиентов
« Ответ #2 : 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\\n<HTML><BODY>200 OK</BODY></HTML>\\n";
	
print $client $html;
	
for (1..50)
	
{
	
my $mes = "<pre>$_ at ".time."</pre>\\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

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 6
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Серверный скрипт для нескольких клиентов
« Ответ #3 : 14 Августа 2005, 00:06:05 »
Да, забыл сказать что про форки лучше читать в perlfork. Там сказано про важные моменты, про которые ничего не говорится в perlipc.

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28