使用Mojolicious的异步聊天服务器

问题描述 投票:2回答:1

你好女士们和先生们!我目前正在编写一个有点像IRC的简约聊天服务器。我使用Mojolicious在perl中编写它,但不幸的是遇到了一个问题。我有以下代码:

#!/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;

不幸的是,打印$ server“$ data”;线实际上不起作用。它发出错误:

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

我查看了Mojolicious的文档,但是找不到如何将从客户端A获得的行发送到其他连接的客户端。

perl asynchronous mojolicious
1个回答
2
投票

虽然$ handle类似于你可以编写的流,但$ server是一个Mojo :: IOloop :: Server对象,所以你不能像你想要的那样写它就不足为奇了。

即使我经常使用Mojolicious,我也不熟悉各种可能性(有很多),但在这里我建议:你需要存储所有连接客户端的列表(例如,在散列或数组中) ,当您收到消息时,您将遍历该客户端列表,将消息发送给所有消息。

当断开连接时,您还需要一种方法(不难)从客户端列表中删除客户端。

此外,我不太确定你的无限循环:如果它阻止第一个连接的客户端上的服务器,我不会感到惊讶。最好使用Mojolicious函数来执行此操作:

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

每次收到消息时都会调用该函数。

这是一个很好的例子,使用Mojolicious :: Light,我觉得很容易理解:https://github.com/kraih/mojo/wiki/Writing-websocket-chat-using-Mojolicious-Lite

© www.soinside.com 2019 - 2024. All rights reserved.