【问题标题】:check if the connection to websocket still open with Net::Async::WebSocket检查到 websocket 的连接是否仍然使用 Net::Async::WebSocket 打开
【发布时间】:2012-08-28 18:39:27
【问题描述】:

我是 Perl 初学者,目前我正在与 websockets 作斗争。经过大量阅读、尝试和复制粘贴后,我得到了这段代码:

use strict;
use warnings;
use utf8;
use Data::Dumper;
use IO::Async::Loop;
use IO::Async::Timer::Periodic;
use Net::Async::WebSocket::Client;
use Protocol::WebSocket::URL;

my ($url, $msg, $last_update);
$url  = 'ws://127.0.0.1/stream';
$msg  = 'get_lists';

my $uri = Protocol::WebSocket::URL->new->parse($url);
my $loop = IO::Async::Loop->new;
my $client = Net::Async::WebSocket::Client->new(
        on_frame => sub {
                my ($self, $frame) = @_; 
                chomp($frame);
                $last_update = time(); # use this in timer below

                # do something else
        }   
);
$loop->add($client);

$client->connect(
        host    => $uri->host, 
        service => $uri->port, 
        url     => $url, 
        on_connected => sub {
                warn "Connection established";

                if ($msg) {
                        $client->send_frame("$msg\n");
                }   
        },  
        on_connect_error=> sub { die "CONNECT: ".Dumper \@_; },
        on_resolve_error=> sub { die "RESOLVE: ".Dumper \@_; },
        on_fail         => sub { die "FAIL: ".Dumper \@_; },
        on_read_eof     => sub {
                $loop->remove($client);

                # reconnect?
        }   
);

# is the connection to socket is still open?
# check every 30 seconds if $last_update was not updated
my $timer = IO::Async::Timer::Periodic->new(
        interval=> 30,
        on_tick => sub {
                if (!$last_update || time()-30 > $last_update) {
                        warn "Connection probably dead. No new data for 20 seconds.";

                        ## check connection

                        ## and reconnect if needed
                }
        },
);
$timer->start;
$loop->add($timer);

$loop->loop_forever;

我还需要一件事,但我不知道如何解决这个问题:

我找到了一些类似https://stackoverflow.com/a/12091867/1645170 的信息,但我不明白如何将 SO_KEEPALIVE 放入我的代码中。我可能应该建立自己的 IO::Socket 连接并以某种方式将其传递给 Async::Net::WebSocket 但我无法做到。其实我真的不知道我应该怎么做。显然是初学者的问题。

我尝试了第二种方法,它应该每 30 秒检查一次连接是否打开(如果没有新数据通过套接字)。同样,同样的问题,但另一方面:不确定如何使用上面的代码检查连接是否打开。

我可以建立一个基本的 IO::Socket 连接,但我想以某种方式使用上面的代码,因为我喜欢 Net::Async::WebSocket 如何处理事件(on_read-eof、on_frame 等)。

【问题讨论】:

    标签: perl connection websocket eof reconnect


    【解决方案1】:

    如何检查它是否仍然有效?

    创建“心跳”。每隔 x 秒从客户端发送一次“ping”,然后等待“pong”返回。超时就死。

    在服务器上,您可以添加自己的套接字(来自示例之一)。

    希望对你有帮助。

    my $serversock = IO::Socket::INET->new(
       LocalHost => "127.0.0.1",
       Listen => 1,
    ) or die "Cannot allocate listening socket - $@";
    
    $serversock->setsockopt(SOL_SOCKET, SO_KEEPALIVE, 1);
    
    my @serverframes;
    
    my $acceptedclient;
    my $server = Net::Async::WebSocket::Server->new(
       handle => $serversock,
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-21
      • 1970-01-01
      • 2015-08-27
      • 1970-01-01
      • 2021-11-05
      • 1970-01-01
      相关资源
      最近更新 更多