使用 Mojolicious 的异步聊天服务器
Asynchronous Chat Server using 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
女士们,先生们,您好!我目前正在编写一个有点类似于 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