はじめに
本棚を整理していたらラクダ本が出てきました。うわー懐かしい、とついつい昔を思い出して読みふけってしまいました。
懐かしさ余って単純なUDPソケット通信プログラムを書いてみました。
対象読者
- perlでスクリプトを書いたことが無い方。
- perlの全盛期を知らないミレニアル世代の方。
- perlと聞くと若かりし頃を思い出すアラフォー世代の方。
実装
UDPサーバ(Perl)
昔Cygwinで勝手に入ったPerl5.8です。5000/udpポートで待ち受けます。
(5.10から入ったsayを使おうとしたら有りませんでした・・・)
#!/usr/bin/perl
#udpserver.pl
#use 5.10.0;
use IO::Socket::INET;
# 標準出力をオートフラッシュ
$| = 1;
# ソケット、受信データ変数定義
my ($socket, $received_data);
# クライアントIP、ポート変数定義
my ($peeraddress, $peerport);
$socket = new IO::Socket::INET (
LocalPort => '5000',
Proto => 'udp',
Reuse => 1,
Type => SOCK_DGRAM
) or die "ERROR in socket creation : $!\n";
while(1)
{
# ソケット受信待ち
$socket->recv($recieved_data,1024);
# 接続してきたクライアントのIPとポートをダンプ
$peer_address = $socket->peerhost();
$peer_port = $socket->peerport();
# say "\n($peer_address, $peer_port) said : $recieved_data";
print "\n($peer_address, $peer_port) said : $recieved_data";
# 接続してきたクライアントにデータを返信
$data = "data from udp server\n";
# say $socket "$data";
$socket->send($data);
}
$socket->close();
UDPクライアント(Java)
Java8です。Eclipse使ってます。
package com.sample.snippet;
import java.io.InterruptedIOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetSocketAddress;
public class UDPClient {
public static void main(String[] args) throws Exception {
// UDPサーバに送信するデータ
byte[] sendData = "UDP send test".getBytes();
// UDPサーバから受信するデータ
byte[] receiveData = new byte[16];
// リトライ回数
int tries = 0;
// 応答可否
boolean response = false;
// UDPパケットを作成
InetSocketAddress serverAddress =
new InetSocketAddress("192.168.0.5", 5000);
DatagramSocket socket = new DatagramSocket();
socket.setSoTimeout(4000);
DatagramPacket sendPacket =
new DatagramPacket(sendData, sendData.length, serverAddress);
DatagramPacket receivePacket =
new DatagramPacket(receiveData, receiveData.length);
// 送信失敗した場合は5回リトライ
do {
socket.send(sendPacket);
try {
socket.receive(receivePacket);
response = true;
} catch (InterruptedIOException e) {
tries++;
System.out.println("Try!!");
}
} while ((!response) && (tries < 5));
if (response) {
System.out.println(new String(receivePacket.getData()));
} else {
System.out.println("No Response!!");
}
}
}
実行
perlコマンドでUDPサーバを起動し、EclipseからUDPClientを実行します。(3回やってます)
C:\src\perl>perl udpserver.pl
(192.168.0.5 , 58633) said : UDP send test
(192.168.0.5 , 60942) said : UDP send test
(192.168.0.5 , 60947) said : UDP send test
Eclipse側コンソール。
data from server
応用すれば正確性を求められない、弾数の多い通信に使えますね。
まとめ
学生の頃(1990年代後半)インターネットが急速に普及し、HTMLとPerlが書ければ10代の若造でもアルバイト代が時給1,500円~2,000円くらい貰えていました。お金の無い学生には有難い収入でした。2000年に入り社会人になってからも3回ほどPerlを使って仕事をしたことが有ります。昔はPerlで飯が食えていました。
当時は「スクリプト言語でWeb(CGI)と言えばPerl」でしたが今やスクリプト言語といえばPython、Ruby、PHPの時代です。2016年に15年ぶりのメジャーバージョンアップでPerl6が出ましたが、日本でのニーズは厳しいものがありますし、今や覚えるメリットも少ないかも知れません。
とは言えPerlはRubyやPythonの基礎になった先人です。なんでも基になったものを知ると知識の裾野が広がるものです。
昔は嫌いな言語トップ3に入っていたJavascriptが今や人気トップ3言語だったりしますし、RubyがRailsの普及と共にシェアを伸ばしたように、めちゃくちゃ凄い機械学習ライブラリとかがPerlで開発されたら皆Perlに飛びついてシェアが復活する可能性もゼロではないです。
Perlが再注目されるようなことが有ったら面白いですね。言語シェアを伸ばすのはそのプラットフォームに居るプログラマ次第なんだと思います。
気分転換&昔が懐かしくなったら現実逃避を兼ねてまた何かPerlで書いてみたいと思います。