2016-03-19 3 views
2

Здравствуйте, дамы и господа! В настоящее время я пишу минималистичный чат-сервер, который будет несколько напоминать IRC. Я пишу его в perl, используя Mojolicious, но, к сожалению, столкнулся с проблемой. У меня есть следующий код:Асинхронный чат-сервер с использованием Mojolicious

#!/usr/bin/perl 

use warnings; 
use strict; 

use Mojo::IOLoop::Server; 

my $server = Mojo::IOLoop::Server->new; 

$server->on(accept => sub { 
    my ($server, $handle) = @_; 
    my $data; 

    print $handle "Connected!\n"; 

    while(1) { 
     $handle->recv($data, 4096); 

     if($data) { 
      print $server "$data"; 
     } 
    } 
}); 

$server->listen(port => $ARGV[0]); 
$server->start; 
$server->reactor->start unless $server->reactor->is_running; 

К сожалению, print $ server «$ data»; линия фактически не работает. Он отдает ошибку:

Mojo::Reactor::Poll: I/O watcher failed: Not a GLOB reference at ./server.pl line 20. 

Я просмотрел документацию для Mojolicious, но не могу найти, как послать линию я получаю от клиента А до остальных подключенных клиентов.

+0

, что харизмы версию вы используете? – sotona

+0

6.56 Клинковые пивные кружки выглядят как – DTSCode

ответ

2

Хотя $ handle - это что-то вроде потока, на который вы можете писать, $ server - это объект Mojo :: IOloop :: Server, поэтому не удивительно, что вы не можете писать на нем, как вы пытаетесь сделать.

Даже если я часто использую Mojolicious, я не знаком со всеми возможностями (их много), но вот что я хотел бы предложить: вам нужно сохранить список всех подключенных клиентов (в хэше или массив, например), и когда вы получаете сообщение, вы перебираете этот список клиентов, чтобы отправить сообщение всем из них.

Вам также нужен способ (не сложно сделать), чтобы удалить клиента из списка ваших клиентов, когда он отключится.

Также я не совсем уверен в вашем бесконечном цикле: я бы не удивился, если бы он блокировал сервер на первом подключенном клиенте. Лучше использовать функции Mojolicious сделать так:

$serv->on(message => sub { send the message to all clients }); 

И эта функция будет вызываться каждый раз, когда получил сообщение.

Вот хороший пример, используя Mojolicious :: Свет, довольно легко понять, я думаю: https://github.com/kraih/mojo/wiki/Writing-websocket-chat-using-Mojolicious-Lite

+0

Большое вам спасибо! Это на самом деле имеет большой смысл. Вы также правы, цикл while блокировался, но я собирался обработать это позже. Я ценю помощь! – DTSCode

Смежные вопросы