【发布时间】:2018-01-11 19:47:16
【问题描述】:
我正在尝试重用以前建立的 websocket 连接以避免 websocket 握手。我发现可以使用build_websocket_tx(更多细节here)构建自定义websocket事务,并且每个websocket连接都有一个连接标识符,可以使用Mojo::Transaction中定义的connection子例程检索(更多细节@987654322 @)。我可以以某种方式将这两者结合起来重新使用连接吗?还有其他方法吗?
PS:Websocket 连接应该是一致的和可重用的。但是 Mojolicoious 没有为 websocket 连接提供任何此类选项。
编辑
没有连接重用的示例代码。
#!/usr/bin/perl
use strict;
use warnings;
use Mojo::UserAgent;
use JSON qw |encode_json|;
my $ua = Mojo::UserAgent->new;
my $url = "wss://trello.com/1/Session/socket";
$| = 1;
sub _connect {
my $req = {
type => "ping",
reqid=> 0
};
$ua->websocket(
$url => sub {
my ($ua, $tx) = @_;
die "error: ", $tx->res->error->{message}, "\n" if $tx->res->error;
die 'Not a websocket connection' unless $tx->is_websocket;
# Connection established.
$tx->on(
message => sub {
my ($tx, $msg) = @_;
print "$msg\n";
$tx->closed; #Close connection
});
$tx->send(encode_json($req));
});
}
sub reuse_conn {
# Re use connection
}
_connect();
Mojo::IOLoop->start unless Mojo::IOLoop->is_running;
【问题讨论】:
-
你想通过'重用'连接来完成什么?
-
@Сухой27 因为 websocket 是一个有状态的协议。我想跟踪所有已经授权的 websocket 连接,这样我就不必为每个客户端请求一次又一次地重新授权每个连接的开销。这对您来说可能没有意义,但它需要克服一次又一次重新发送相同请求的大量开销。
-
我不确定我的理解是否正确,但是一旦您建立了客户端连接并设置了事件处理程序,您就可以使用此连接,直到网络出现故障或另一方将其关闭。此时您必须启动新的客户端连接。 “重用”不太适合这种方案。
-
@Сухой27 实际上,您做对了。考虑整个过程是异步的,假设连接已经建立,一段时间后用户发送另一个请求,我想做的是使用之前建立的连接(如果它没有关闭),而不是为每个请求创建一个新连接用户制作的。我们为用户发送的每个请求都创建一个连接听起来不是错的吗?至少在 websocket 的上下文中是这样。 Websockets 连接应该是持久的和可重用的。
-
@Ed。我添加了不重用连接的代码 sn-p。我能够重用连接的唯一方法是存储事务对象并在后续调用中使用它。
标签: perl mojolicious mojo