One IT Thing

IT業界で飯を食う為の学習系雑記

java network perl

JavaとPerlでUDPソケット通信

投稿日:2019年5月24日 更新日:

はじめに

本棚を整理していたらラクダ本が出てきました。うわー懐かしい、とついつい昔を思い出して読みふけってしまいました。

懐かしさ余って単純な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で書いてみたいと思います。

-java, network, perl

執筆者:

関連記事

JavaコアAPI数の遷移をChart.jsでグラフ化

Javaはデフォルトで多数のAPIクラスを持っていてコーディングを楽にしてくれます。その数は増え続けているんでしょうか。 バージョンが上がるごとにどう変化しているか調べてchart.jsでグラフ化しま …

IVS、サロゲートペアが混じった文字列をJavaのWebアプリでワードカウントする

(結論:java.text.BreakIteratorは「サロゲートペア文字 + IVS」の8バイト文字も1文字としてカウントしてくれる) 先日、IPAmj明朝フォントを使ってIVSを含んだUnico …

IVS対応フォント「IPAmj明朝」で使えるフォントをWeb上に一覧表示してみる(1)

目次1 IPAmj明朝フォントとは2 日本における漢字のコンピュータ表示課題3 サロゲートペアが対応策だが4 IVS(ideographic variation sequence) とは5 そこでIP …

Tomcat9をCentOS7&OpenJDK11で起動

CentOS 7.6にOpenJDK 11を以下の記事で入れている状態です。 One IT ThingCentOS7にOpenJDK11をインストール、alternatives後の再ログイン …

IPAmj明朝のttfファイルをJVMに読み込ませてSwingで表示(要Java11)

目次1 はじめに2 Java11でSwingがIVSを認識するようになった3 Java Swingソース4 動作確認4.1 Java 8(1.8.0_202)で実行4.2 Java 11(11.0.2 …

 

shingo.nakanishi
 

東京在勤、職歴20年越え中年ITエンジニアです。まだ開発現場で頑張っています。

19歳(1996年)から書き始めた個人日記が5,000日を超え、残りの人生は発信をして行きたいと思い、令和元日からこのサイトを開始しました。勉強と試行錯誤をしながら、自分が経験したIT関連情報を投稿しています。

私と同じく、今後IT業界で生計を立てて行きたいと考えている方や、技術共有したいけどフリーランスで孤独、といった方と一緒に成長、知識共有して行けたら楽しいな、と思っています。