2

問題

Java クライアント/サーバー アプリケーションのネットワーク サービス ディスカバリを開始しようとしています。クライアントが他のプラットフォーム上にある未来に備えたいと思います。おそらくNETCFとAndroidだけです。これはロケット手術であってはなりません。

オプション

ここにリストされているオプションを数時間参照すると、mdnsjava が現時点で最適なオプションであることがわかります。以下に私の研究の一部を掲載しましたが、現在の評判では 2 つのリンクに制限されています。

私はJmdnsの例をコンパイル、登録、ブラウジングするのにそれほど苦労することはありませんでした...しかし、それは単に確実に動作しませんでした。ブラウザは、サービスがまったく見つかった場合でも、255.255.254 サブネットの IP アドレスを返しました。

Mdnsjava はより良い評価を得ていますが、私は完全に実行に失敗しました。私が見つけた例は、単独では機能しないコード スニペットであり、javadocs は実際にはドキュメントではありません。名前のない (ただし必須の) 引数を持つパブリック メソッドのリストにすぎません。

Avahi4j は 2009 年以来 v0.1 のままでした。それに時間をかけませんでした。

Bonjour は、Apple 以外のプラットフォームでシステム ライブラリを必要とするようです。

私がまったく知らない Upnp は、最小限の要件を満たすために膨大な量のインフラストラクチャが必要になるようです。

質問

サービスを mdnsjava に登録するコンパイル可能な実際の例はありますか? 2015 年に別のライブラリを調査するのが最善の方法である場合は、別のライブラリを調査するように言われる準備ができています.

4

1 に答える 1

2

最も簡単な答えは、少なくとも私の単純なアプリケーションでは、MulticastSocket を使用して自分自身を展開することでした。

これを行おうとしている人への注意: クライアントを .NET CF 3.5 で動作させるのはあまり楽しいものではありませんでした。非同期サポートはなく、タイムアウトは機能せず、(CF での) マルチキャスト サポートに関するドキュメントは存在しません。独自のスレッドで同期クライアントを作成することになりました。最初の数台のサーバーをすぐに返し、他のサーバーを 1 分以上待機します。残忍。

import java.net.MulticastSocket;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;

public class Main {
    public static void main(String[] args) {
        if( args.length == 0 ) runClient();
        if(args[0].equals("s")) runServer();
        else runClient();
    }

    static String mcastAddr = "239.255.100.100";  // Chosen at random from local network block at http://www.iana.org/assignments/multicast-addresses/multicast-addresses.xhtml
    static int port = 4446;

    public static void runServer() {
        while (true) {
            try {
                MulticastSocket s = new MulticastSocket(port);
                InetAddress group = InetAddress.getByName(mcastAddr);
                s.joinGroup(group);

                byte[] recData = new byte[100];
                DatagramPacket receivePacket = new DatagramPacket(recData, recData.length);
                s.receive(receivePacket);
                String strrec = new String(recData,0,receivePacket.getLength());
                print("server received: " + strrec);
                print("from: " + receivePacket.getAddress().toString());

                if(strrec.equals("Are you there?")) {
                    String msg = "Here I am";
                    byte[] msgData = msg.getBytes();
                    DatagramPacket msgPacket = new DatagramPacket(msgData, msgData.length, receivePacket.getAddress(), receivePacket.getPort());
                    s.send(msgPacket);
                    print("server sent: " + msg + "\n");
                } else {
                    print("Didn't send; unrecognized message.");
                }


            } catch (Exception e) {
                print(e.toString());
            }
        }
    }

    public static void runClient() {
        try {
            DatagramSocket s = new DatagramSocket();

            String msg = "Are you there?";  // Magic string
            byte[] msgData = msg.getBytes();
            DatagramPacket datagramPacket = new DatagramPacket(msgData, msgData.length, InetAddress.getByName(mcastAddr), port);
            s.send(datagramPacket);
            print("client sent: " + msg);

            byte[] recData = new byte[100];
            DatagramPacket receivePacket = new DatagramPacket(recData, recData.length);
            s.receive(receivePacket);
            String strrec = new String(recData,0,receivePacket.getLength());
            print("client received: " + strrec);
            print("from " + receivePacket.getAddress().toString() + " : " + receivePacket.getPort());

            System.exit(0);
        } catch (Exception e) {
            print(e.toString());
        }
    }
    static void print(String s) {             System.out.println(s);         }
}
于 2015-10-30T16:40:40.303 に答える