Android 通过局域网udp广播自动建立socket连接
生活随笔
收集整理的這篇文章主要介紹了
Android 通过局域网udp广播自动建立socket连接
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Android開發中經常會用到socket通訊。由于項目需要,最近研究了一下這方面的知識。 需求是想通過wifi實現android移動設備和android平臺的電視之間的文件傳輸與控制。 毫無疑問這中間一定需要用到socket來進行通信。今天就兩臺設備的握手連接方式分享一下吧,該方法只是本人個人想法的實現,僅供參考,如有雷同,不勝榮幸。
? ?要想使用socket進行通訊,就必須知道服務端的IP地址,我使用的是通過udp局網廣播來實現局網內服務端的搜尋建立連接。以下是代碼實現。
? ?首先是客戶端:? ?
public class MainActivity extends Activity {/*發送廣播端的socket*/private MulticastSocket ms;/*發送廣播的按鈕*/private Button sendUDPBrocast;@Overridepublic 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{@Overridepublic 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;@Overridepublic 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();}}@Overridepublic void run() {// TODO Auto-generated method stubbyte 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 通过局域网udp广播自动建立socket连接的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: office2003/2007/2010
- 下一篇: Scrum联盟发布《2016年度Scru