Symfoware

Symfowareについての考察blog

Python Javaでマルチキャストプログラム

複数の端末に効率的にパケットを配信できる「マルチキャスト」

マルチキャスト 技術解説
IPマルチキャスト概要

239.0.0.1といった、マルチキャスト用のIPで通信を行う模様。
PythonやJavaで実装してみます。



Pythonでマルチキャスト



Pythonでネットワークプログラミング
こちらを参考に・・・というかそのまま動かしてみました。

まず、サーバー側。

・send_udp_multicast.py


  1. #!/usr/bin/env python
  2. # -*- coding : utf-8 -*-
  3. # マルチキャスト - 送信
  4. # http://memo.saitodev.com/home/python_network_programing/
  5. import socket
  6. import time
  7. from contextlib import closing
  8. def main():
  9.     
  10.     local_address = '192.168.1.102' # 送信側のPCのIPアドレス
  11.     multicast_group = '239.0.0.1' # マルチキャストアドレス
  12.     port = 4000
  13.     
  14.     with closing(socket.socket(socket.AF_INET, socket.SOCK_DGRAM)) as sock:
  15.         
  16.         sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_IF, socket.inet_aton(local_address))
  17.         
  18.         count = 0
  19.         while True:
  20.             message = 'From Py Server : {0}'.format(count).encode('utf-8')
  21.             print(message)
  22.             sock.sendto(message, (multicast_group, port))
  23.             count += 1
  24.             time.sleep(1)
  25.             
  26. if __name__ == '__main__':
  27.     main()





受信側

・recv_udp_multicast.py


  1. # -*- coding:utf-8 -*-
  2. # マルチキャスト - 受信側
  3. # http://memo.saitodev.com/home/python_network_programing/
  4. import socket
  5. from contextlib import closing
  6. def main():
  7.     local_address = '192.168.1.4' # 受信側のPCのIPアドレス
  8.     multicast_group = '239.0.0.1' # マルチキャストアドレス
  9.     port = 4000
  10.     bufsize = 4096
  11.     with closing(socket.socket(socket.AF_INET, socket.SOCK_DGRAM)) as sock:
  12.         sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
  13.         sock.bind(('', port))
  14.         sock.setsockopt(socket.IPPROTO_IP,
  15.                         socket.IP_ADD_MEMBERSHIP,
  16.                         socket.inet_aton(multicast_group) + socket.inet_aton(local_address))
  17.         while True:
  18.             print(sock.recv(bufsize))
  19.             
  20.             
  21. if __name__ == '__main__':
  22.     main()





動かしてみます。
左側がサーバ、右側のコンソールがクライアントプログラムです。


[広告 ] VPS



狙い通りです。





Java + Pythonでマルチキャスト



こちらを参考に、サーバー側をJavaで記載してみます。
5.3. マルチキャスト送受信プログラム

・MulticastSender.java


  1. import java.net.InetAddress;
  2. import java.net.MulticastSocket;
  3. import java.net.DatagramPacket;
  4. public class MulticastSender {
  5.     
  6.     private static final int PORT = 4000;
  7.     private static final String MCAST_ADDRESS = "239.0.0.1";
  8.     
  9.     public static void main(String args[]) {
  10.         MulticastSocket socket = null;
  11.         try {
  12.             InetAddress mcastAddress = InetAddress.getByName(MCAST_ADDRESS);
  13.             socket = new MulticastSocket();
  14.             
  15.             int count = 0;
  16.             while (true) {
  17.                 String message = "From Java Server : " + count;
  18.                 System.out.println(message);
  19.                 byte[] bytes = message.getBytes();
  20.                 DatagramPacket packet = new DatagramPacket(bytes, bytes.length, mcastAddress, PORT);
  21.                 socket.send(packet);
  22.                 count++;
  23.                 Thread.sleep(1000);
  24.             }
  25.         } catch (Exception e) {
  26.             e.printStackTrace();
  27.         } finally {
  28.             if (socket != null) {
  29.                 socket.close();
  30.             }
  31.         }
  32.     }
  33. }




Pythonの時と同様、左側がJavaのサーバー、
右側のコンソールが先ほどと同じPythonのクライアントです。


[広告 ] VPS




関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2016/03/03(木) 22:30:21|
  2. Python
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<CentOS 7.2をMinimal ISOから最小構成でインストールする | ホーム | Ubuntu 14.04にMonoDevelopをインストール>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1861-1f1e792e
この記事にトラックバックする(FC2ブログユーザー)