私は、ローカルプログラムと外部のインタラクティブなWebサイトの間の「中間者」として働くperlスクリプトを持っています。Perl、無限ループのwebsocket
問題は、外部Webサイトがプレーンtcp接続からWebsocket接続に移行したことです。
初期接続後、クライアント(スクリプト)とサーバー(外部Webサイト)がハンドシェイクを行い、スクリプトがユーザー名とパスワードを送信し、サーバーが最後に応答しますその後、スクリプトは無限ループに入り、両方の接続からのデータを待ってから、そのデータを処理し、必要に応じて接続に「印刷」します。
Mojo :: UserAgentとprotocol :: websocketを使用してサーバーとwebsocket接続を確立できましたが、ハンドシェイクと他の情報交換(ユーザー名、パスワードなど)を経由しますが、私はIO :: Selectを使って無限ループにwebsocket接続を "スロー"することができませんでした。他の提案は間違いなく歓迎されています)。 、私は発見した無限ループの例
# Creating connection for local program
$lsn=new IO::Socket::INET(
Proto => 'tcp',
LocalPort => 6000,
Listen => 1,
);
unless(defined $lsn){
print"$0: $!\n";
exit 1;
}
print"Waiting for local program connection on port 6000\n";
$server=$lsn->accept;
$lsn->close;
unless(defined $server){
print "$0: Unable to accept incoming connection: $!\n";
exit 1;
}
# At this point, the script is waiting for a connection from
# the local program on port 6000
printf"Connection accepted from %s\n",$server->peerhost;
select $server;
binmode $server;
$stdin=$server;
(select)->autoflush(1);
# Creating connection for external website
$net=new IO::Socket::INET(
Proto => 'tcp',
PeerAddr => $yog,
PeerPort => $yserverport,
);
unless(defined($net)){
print "Can't connect!\n";
exit 1;
}
$net->autoflush(1);
####################################
# Here the script and server will #
# exchange information few times #
####################################
my $sel=new IO::Select($stdin,$net);
$net->autoflush(0);
while (1){
foreach my $i($sel->can_read(0.05)){
if($i==$net){
&dosomething;
$net->flush;
}
else{
&dosomething2;
$net->flush;
}
}
}
Iが着信データをチェックすることができる無限ループを使用する必要があるので、この場合には適していない。
スクリプトの関連部分は以下の通りです。両方の接続で。
に更新する必要がありますが、スクリプトはac lientスクリプトやプログラムでは、websocketスクリプトは実際には独自の「サーバ」なので、コマンドラインから呼び出すことができます。 "perl myscript.pl"とCTL + Cをキャンセルします。バックグラウンドでスクリプトを実行する場合は、スクリプトをサービスとして登録する必要があります。これはOSによって異なります。他にも少なくともLinuxでは "perl myscript.pl nohup&"を実行してコマンドラインから実行し、ターミナルにエスケープすることができます。私はこれが役立つことを願っています – Bryan