2012-02-25 10 views
1

私は(ネットワーク上で)デスクトップサーバーアプリケーション(どちらもJavaとGUIベースでプログラミング)と通信するアンドロイドアプリケーションを持っています。今はテストするために、私は単にアンドロイド携帯電話のソケットを指定する方法があります。しかし、将来、私がアプリケーションをリリースするとき、私はそれがサーバーにそれ自身で接続しようとすることができるようにしたい。自動的にサーバーのためのAndroidの検索

これまで私が持っていたアイデアのいくつかは、電話のIPアドレスを取得してから、同じポートのクラスCアドレス空間をループして、それらのソケットが接続されているかどうかを確認しています。あなたには他に何か提案がありますか?

また、Androidで電話のIPアドレスを取得するにはどうすればよいですか?私は方法がありますが、それはアンドロイド2.3以降でのみ動作します... ICS上では完全にフロップしてランダムな不器用さを与えます。ここにあります:

public String getLocalIpAddress() { 
    try { 
     for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) { 
      NetworkInterface intf = en.nextElement(); 
      for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) { 
       InetAddress inetAddress = enumIpAddr.nextElement(); 
       if (!inetAddress.isLoopbackAddress()) { 
        return inetAddress.getHostAddress().toString(); 
       } 
      } 
     } 
    } catch (Exception ex) { 
    } 
    return null; 
} 
+0

私は255.255.255.255:18250に自動接続しようとしましたが、私のサーバー(*:18250)は明らかにブロードキャストを取得しませんでした。 –

答えて

1

Cクラスのネットワークで不必要なオーバーキルです。完全な最後の手段でない限り、私はそれを使用しません。あなたのユーザはAクラスのネットワーク(職場では10.xxx、Bのクラス)を持っているかもしれません...彼はそれを好きですから;-)

より良い方法は、ブロードキャストアドレスあなたが好きなら、それはもう少し仕事です)。 UDPデータグラムに基づいて、アプリケーション用の単純な検出プロトコルを実装することができます。そのような場合、サーバはブロードキャストポート(例えば192.168.0.255:6666)のポートを聞いて、リクエスタにリッスンしているIP:PORTを送信することで任意のアクティビティに応答します。

Phone->Broadcast: "Is there anybody?" 
Server1->Phone : "I am here. Talk to me at 192.168.0.123:6666" 
Server2->Phone : "I am here. Talk to me at 192.168.0.124:6666" 

クライアントは、(私はクライアントサーバー接続がTCPであると仮定し、それは何もすることができ、利用可能なサーバを表示し、その答えで提供TCPポートに接続した後、ユーザーが接続したいものに尋ねることができますアイデアは同じです)。

+0

私はTCPを使用しています。クラスCのアドレス空間を数秒で見つけることができます。だから私はそれが私の最終的な解決になると思います。あなたのご意見ありがとうございます。次回は大規模なクライアントサーバーアプリケーションを試してみます。ありがとう! –

+0

あなたのメソッドに切り替えました。もっとうまくいく。どうもありがとう。 –

+0

@MohammadAdib:これをどのように正確に実装しましたか? [彼らは](http://codeisland.org/2012/udp-multicast-on-android/)、すべてのアンドロイドデバイスがマルチキャストを正しく処理するわけではないので、究極の解決策を見つけましたか? – infografnet

0

あなたが探している技術はzero configuration networkingです。幸いにも、すでにサードパーティのオープンソースのJavaライブラリが実装されているので、自分で作成する必要はありません。私はJmDNSをjavaとandroidの両方をサポートすることをお勧めします。私は自分のAndroidアプリケーションでそれを使用しています。

ゼロコンフィギュレーションネットワークは、多くのサーバークライアントのAndroidアプリケーションで既に広く使用されています。私の回答hereのサンプルコードをチェックしてください。

関連する問題