Androidプログラミングはローカルエリアネットワークudpブロードキャストに基づいて自動的にsocket接続を確立する方法を実現する

3680 ワード

この例では、Androidプログラミングにより、ローカルエリアネットワークudpブロードキャストに基づいて自動的にsocket接続を確立する方法について説明します.皆さんの参考にしてください.具体的には以下の通りです.
Android開発ではsocket通信がよく使われる.プロジェクトの必要性から、最近この方面の知識を研究しました.需要はwifiを通じてandroidモバイルデバイスとandroidプラットフォームのテレビ間のファイル転送と制御を実現したいことです.間違いなくこの中で必ずsocketを使って通信する必要があります.今日は2台のデバイスの握手接続方法について共有しましょう.この方法は本人の個人的な考えの実現にすぎません.参考にしてください.同じように、光栄に存じます.
SOcketを使用して通信するには、サービス側のIPアドレスを知る必要があります.私はudp局網ブロードキャストを使用して局網内のサービス側の検索を実現し、接続を確立します.以下はコード実装です.
まずクライアント:

public class MainActivity extends Activity { 
 /*      socket*/ 
 private MulticastSocket ms; 
 /*       */ 
 private Button sendUDPBrocast; 
 @Override 
 public void onCreate(Bundle savedInstanceState) { 
  super.onCreate(savedInstanceState); 
  init(); 
 } 
 /*     */ 
 public void init() { 
  setContentView(R.layout.main); 
  sendUDPBrocast = (Button) findViewById(R.id.send); 
  sendUDPBrocast.setOnClickListener(new SendUDPBrocastListener()); 
  try { 
   /*  socket  */ 
   ms = new MulticastSocket(); 
  } catch (Exception e) { 
   e.printStackTrace(); 
  } 
 } 
 /** 
  *      ,        
  * */ 
 class SendUDPBrocastListener implements OnClickListener{ 
  @Override 
  public void onClick(View v) { 
   //      ,                  
   DatagramPacket dataPacket = null; 
   try { 
    ms.setTimeToLive(4); 
    //    IP(          IP)        ,  server                 IP  
    byte[] data = "192.168.1.101".getBytes(); 
    //224.0.0.1      
    InetAddress address = InetAddress.getByName("224.0.0.1"); 
    //                        
    System.out.println(address.isMulticastAddress()); 
    dataPacket = new DatagramPacket(data, data.length, address, 
      8003); 
    ms.send(dataPacket); 
    ms.close(); 
   } catch (Exception e) { 
    e.printStackTrace(); 
   } 
  } 
 } 
} 

以下はサービス側です.

public class MainActivity extends Activity implements Runnable { 
 private MulticastSocket ds; 
 String multicastHost="224.0.0.1"; 
 InetAddress receiveAddress; 
 @Override 
 public void onCreate(Bundle savedInstanceState) { 
  super.onCreate(savedInstanceState); 
  setContentView(R.layout.main); 
  try { 
   ds = new MulticastSocket(8003); 
   receiveAddress=InetAddress.getByName(multicastHost); 
   ds.joinGroup(receiveAddress); 
   new Thread(this).start(); 
  } catch (Exception e1) { 
   // TODO Auto-generated catch block 
   e1.printStackTrace(); 
  } 
 } 
 @Override 
 public void run() { 
  // TODO Auto-generated method stub 
  byte buf[] = new byte[1024]; 
  DatagramPacket dp = new DatagramPacket(buf, 1024); 
  while (true) { 
   try { 
    ds.receive(dp); 
    //Toast.makeText(this, new String(buf, 0, dp.getLength()), Toast.LENGTH_LONG); 
    System.out.println("client ip : "+new String(buf, 0, dp.getLength())); 
   } catch (Exception e) { 
    e.printStackTrace(); 
   } 
  } 
 } 
}

これにより、モバイルデバイスが接続するローカルネットワーク内にsocketのサービス側が存在すると、サービス側はクライアントからのブロードキャストを受信し、サービス側は受信したIPを介してクライアントと接続し、制御およびファイルの伝送を行うことができる.udpブロードキャストは、ローカルネットワークの伝送速度が遅くなり、udpが信頼できないプロトコルであるため、送信されたブロードキャストサービス側が必ずしも受信できるとは限らないため、スレッド内でサービス側の応答を受信するまでブロードキャストを送信するが、ローカルネットワーク内にサービス側が存在しないとデッドサイクルに陥るため、時間制限操作を行うなど、実際には多くの論理処理が必要であることに注意してください.具体的には個人のニーズを見てみましょう.
この文書がAndroidプログラムの設計に役立つことを願っています.