ラジコの録音、東京の放送を取得する一案(6 サーバークライアントを試す
感覚的にはWEBサーバーを介したほうが簡単そうです。
けど、今回はソケットを使います。勉強のためです。
とはいえ、あまり時間を書けて1からやっても仕方ないので、
文明の利器、検索を使います 笑
ものすごく有用なページがヒット。
このサンプルをつかわせてもらいましょ。
動作検証
こういうときは、とりあえず、コードを借りてきて自分の環境で動作させてみます。
サーバー起動
↓
クライアント起動
↓
”Hello”とサーバーに送信
↓
”Hello”をサーバーで受取、”echo:Hello”と返す
↓
サーバーからの応答”echo:Hello”を表示
という流れです。
クライアントから何か文字列を送り、サーバーはそれに対して加工してクライアントに返しています。
これを改造すれば、
クライアントから「局ID」を送信し、トークンをサーバーから受信する
ということが簡単にできそうですね。
サーバーはこのようにしました。
#!/usr/bin/perl
use strict;
use warnings;
use Socket;
use Fcntl qw(:flock);
# 2. 受付用ソケット情報の作成
my $local_port = 9000;
#ロック
open LOCK , "+>" , "./serverlock.${local_port}";
if ( flock LOCK ,LOCK_EX|LOCK_NB ){
print "OK LOCK!\n";
}else{
print "NG LOCK!$!\n";
exit ;
}
# サーバ
# 1. 受付用ソケットの作成
my $sock_receive;
socket($sock_receive, PF_INET, SOCK_STREAM, getprotobyname( 'tcp' ))
or die "Cannot create socket: $!";
my $pack_addr = sockaddr_in($local_port, INADDR_ANY);
# 3. 受付用ソケットと受付用ソケット情報を結びつける
bind($sock_receive, $pack_addr)
or die "Cannot bind: $!";
# 4. 接続を受け付ける準備をする。
listen($sock_receive, SOMAXCONN)
or die "Cannot listen: $!";
# 5. 接続を受け付けて応答する。
my $sock_client; # クライアントとの通信用のソケット
while (accept( $sock_client, $sock_receive )) {
my $content;
# クライアントからのデータの読み込み
while (my $line = <$sock_client>) {
$content .= $line;
}
my $ret=`./token_radiko.sh $content`;
# クライアントへのデータの書き込み
print $sock_client "$ret";
close $sock_client;
}
一応ロック機構を付けました。なくても良いかもしれません。
そして、返却文字列を前述したトークン取得のシェルスクリプトにしました。
クライアントはこんな感じ
#!/usr/bin/perl use strict; use Socket; my $CH=""; if (@ARGV == 1){ $CH=$ARGV[0]; }else{ print "usage : ./$0 [CHANNEL]\n"; exit 1; } # クライアント # 1. ソケットの作成 my $sock; socket($sock, PF_INET, SOCK_STREAM, getprotobyname('tcp' )) or die "Cannot create socket: $!"; # 2. ソケット情報の作成 # 接続先のホスト名 my $remote_host = 'domein.com'; my $packed_remote_host = inet_aton($remote_host) or die "Cannot pack $remote_host: $!"; # 接続先のポート番号 my $remote_port = 9000; # ホスト名とポート番号をパック my $sock_addr = sockaddr_in($remote_port, $packed_remote_host) or die "Cannot pack $remote_host:$remote_port: $!"; # 3. ソケットを使って接続 connect($sock, $sock_addr) or die "Cannot connect $remote_host:$remote_port: $!"; # 4. データの書き込み # 書き込みバッファリングをしない。 my $old_handle = select $sock; $| = 1; select $old_handle; print $sock $CH; # 書き込みを終了する shutdown $sock, 1; # 5. データの読み込み my $cnt=0; while (my $line = <$sock>) { print "$cnt $line"; $cnt++; } # 6. ソケットを閉じる close $sock;
チャンネルIDを引数にして実行するだけです。
これでクライアントにいながら、さくらインターネットで取得したトークンだけを得られます。
ディスカッション
コメント一覧
まだ、コメントがありません