【问题标题】:Asynchronous Chat Server using Mojolicious使用 Mojolicious 的异步聊天服务器
【发布时间】:2016-03-19 04:38:35
【问题描述】:

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

【问题讨论】:

  • 你用什么mojo版本?
  • 6.56 叮叮当当的啤酒杯看起来像

标签: perl asynchronous mojolicious


【解决方案1】:

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

【讨论】:

  • 非常感谢!这实际上很有意义。你也是对的,while 循环被阻塞了,但我稍后会处理它。感谢您的帮助!
猜你喜欢
  • 2017-12-08
  • 2014-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多