Android編程實(shí)現(xiàn)基于局域網(wǎng)udp廣播自動(dòng)建立socket連接的方法
本文實(shí)例講述了Android編程實(shí)現(xiàn)基于局域網(wǎng)udp廣播自動(dòng)建立socket連接的方法。分享給大家供大家參考,具體如下:
android開(kāi)發(fā)中經(jīng)常會(huì)用到socket通訊。由于項(xiàng)目需要,最近研究了一下這方面的知識(shí)。 需求是想通過(guò)wifi實(shí)現(xiàn)android移動(dòng)設(shè)備和android平臺(tái)的電視之間的文件傳輸與控制。 毫無(wú)疑問(wèn)這中間一定需要用到socket來(lái)進(jìn)行通信。今天就兩臺(tái)設(shè)備的握手連接方式分享一下吧,該方法只是本人個(gè)人想法的實(shí)現(xiàn),僅供參考,如有雷同,不勝榮幸。
要想使用socket進(jìn)行通訊,就必須知道服務(wù)端的IP地址,我使用的是通過(guò)udp局網(wǎng)廣播來(lái)實(shí)現(xiàn)局網(wǎng)內(nèi)服務(wù)端的搜尋建立連接。以下是代碼實(shí)現(xiàn)。
首先是客戶端:
public class MainActivity extends Activity { /*發(fā)送廣播端的socket*/ private MulticastSocket ms; /*發(fā)送廣播的按鈕*/ private Button sendUDPBrocast; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); init(); } /*初始化參數(shù)*/ public void init() { setContentView(R.layout.main); sendUDPBrocast = (Button) findViewById(R.id.send); sendUDPBrocast.setOnClickListener(new SendUDPBrocastListener()); try { /*創(chuàng)建socket實(shí)例*/ ms = new MulticastSocket(); } catch (Exception e) { e.printStackTrace(); } } /** * 單擊按鈕時(shí),發(fā)送局域網(wǎng)廣播 * */ class SendUDPBrocastListener implements OnClickListener{ @Override public void onClick(View v) { //發(fā)送的數(shù)據(jù)包,局網(wǎng)內(nèi)的所有地址都可以收到該數(shù)據(jù)包 DatagramPacket dataPacket = null; try { ms.setTimeToLive(4); //將本機(jī)的IP(這里可以寫(xiě)動(dòng)態(tài)獲取的IP)地址放到數(shù)據(jù)包里,其實(shí)server端接收到數(shù)據(jù)包后也能獲取到發(fā)包方的IP的 byte[] data = "192.168.1.101".getBytes(); //224.0.0.1為廣播地址 InetAddress address = InetAddress.getByName("224.0.0.1"); //這個(gè)地方可以輸出判斷該地址是不是廣播類型的地址 System.out.println(address.isMulticastAddress()); dataPacket = new DatagramPacket(data, data.length, address, 8003); ms.send(dataPacket); ms.close(); } catch (Exception e) { e.printStackTrace(); } } } }
以下是服務(wù)端:
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(); } } } }
這樣一來(lái)如果移動(dòng)設(shè)備所連接的局網(wǎng)內(nèi)存在socket的服務(wù)端,服務(wù)端就會(huì)接收到客戶端發(fā)出的廣播,然后服務(wù)端再通過(guò)接收到的IP與客戶端進(jìn)行連接進(jìn)而就可以進(jìn)行控制及文件的傳輸了。需要注意的是,udp廣播會(huì)導(dǎo)致局網(wǎng)傳輸速度變慢,而且udp為不可靠協(xié)議,發(fā)出的廣播服務(wù)端不一定都能夠收到,所以在實(shí)際情況中需要做很多邏輯處理,比如在線程里發(fā)廣播直到收到服務(wù)端的回應(yīng) 但如果局網(wǎng)內(nèi)不存在服務(wù)端就會(huì)陷入死循環(huán),所以這時(shí)就要做限時(shí)操作了等等。。。 具體的看個(gè)人需求而言了吧。
希望本文所述對(duì)大家Android程序設(shè)計(jì)有所幫助。
- Android Socket通信詳解
- Android編程之客戶端通過(guò)socket與服務(wù)器通信的方法
- Android中Socket通信的實(shí)現(xiàn)方法概述
- Android中使用WebSocket實(shí)現(xiàn)群聊和消息推送功能(不使用WebView)
- Android NDK中socket的用法以及注意事項(xiàng)分析
- python服務(wù)器與android客戶端socket通信實(shí)例
- android開(kāi)發(fā)socket編程之udp發(fā)送實(shí)例分析
- Android中使用socket通信實(shí)現(xiàn)消息推送的方法詳解
- Android使用socket創(chuàng)建簡(jiǎn)單TCP連接的方法
- Android socket實(shí)現(xiàn)原理詳解 服務(wù)端和客戶端如何搭建
相關(guān)文章
Android10 分區(qū)存儲(chǔ)的適配規(guī)則
Android設(shè)備 在Sdk29己以上推出了分區(qū)存儲(chǔ),類似iOS沙箱。應(yīng)用App 目標(biāo)版本號(hào)為29或以上則需要適配分區(qū)存儲(chǔ),本文將具體的講解適配規(guī)則2021-05-05Android開(kāi)發(fā)判斷一個(gè)app應(yīng)用是否在運(yùn)行的方法詳解
這篇文章主要介紹了Android開(kāi)發(fā)判斷一個(gè)app應(yīng)用是否在運(yùn)行的方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Android判斷應(yīng)用運(yùn)行狀態(tài)的相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下2017-11-11Android開(kāi)發(fā)之FloatingActionButton懸浮按鈕基本使用、字體、顏色用法示例
這篇文章主要介紹了Android開(kāi)發(fā)之FloatingActionButton懸浮按鈕基本使用、字體、顏色用法,結(jié)合實(shí)例形式分析了Android FloatingActionButton懸浮按鈕的基本功能、布局、使用方法及操作注意事項(xiàng),需要的朋友可以參考下2019-03-03Android中使用OkHttp包處理HTTP的get和post請(qǐng)求的方法
OkHttp包為安卓開(kāi)發(fā)中的HTTP協(xié)議網(wǎng)絡(luò)編程帶來(lái)了很大的便利,這里我們就來(lái)看一下最基本的、Android中使用OkHttp包處理HTTP的get和post請(qǐng)求的方法:2016-07-07Android Jetpack庫(kù)剖析之Lifecycle組件篇
本章也是帶來(lái)了Jetpack中我認(rèn)為最重要的架構(gòu)組件Lifecycle的原理探索,至于為什么覺(jué)得它是最重要是因?yàn)橄馰iewModel,LiveData這些組件也依賴于Lifecycle來(lái)感知宿主的生命周期,那么本章我們帶著幾個(gè)問(wèn)題來(lái)探索一下這個(gè)組件2022-07-07