perl - 使用 Mojolicious 的异步聊天服务器

标签 perl asynchronous mojolicious

女士们先生们您好!我目前正在编写一个有点类似于 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 获得的线路发送到其他连接的客户端。

最佳答案

虽然 $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

关于perl - 使用 Mojolicious 的异步聊天服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36097903/

相关文章:

perl - 如何从 Perl/TK 中的子例程获取调用者小部件?

c# - 异步和等待混淆

perl - 如何在Mojolicious模板中使用新的语法功能

perl - 为什么 Hypnotoad 的热部署会重新运行旧的 http 请求?

.net - 异步记录到数据库 .Net

datetime - Perl 的 Mojo::XMLRPC 和操作 Mojo::Date 格式

linux - 从 Linux 终端运行 PERL 脚本时保留重音字母

linux - Dancer 在读取 GET 请求时随机挂起

perl - 需要解释 `~0` 与 `2**64` 有和没有 `use integer`

c# - 上次。等待与线程一起工作吗?