Android編程實現(xiàn)基于局域網(wǎng)udp廣播自動建立socket連接的方法
本文實例講述了Android編程實現(xiàn)基于局域網(wǎng)udp廣播自動建立socket連接的方法。分享給大家供大家參考,具體如下:
android開發(fā)中經(jīng)常會用到socket通訊。由于項目需要,最近研究了一下這方面的知識。 需求是想通過wifi實現(xiàn)android移動設備和android平臺的電視之間的文件傳輸與控制。 毫無疑問這中間一定需要用到socket來進行通信。今天就兩臺設備的握手連接方式分享一下吧,該方法只是本人個人想法的實現(xiàn),僅供參考,如有雷同,不勝榮幸。
要想使用socket進行通訊,就必須知道服務端的IP地址,我使用的是通過udp局網(wǎng)廣播來實現(xiàn)局網(wǎng)內(nèi)服務端的搜尋建立連接。以下是代碼實現(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實例*/
ms = new MulticastSocket();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 單擊按鈕時,發(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);
//將本機的IP(這里可以寫動態(tài)獲取的IP)地址放到數(shù)據(jù)包里,其實server端接收到數(shù)據(jù)包后也能獲取到發(fā)包方的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();
}
}
}
}
這樣一來如果移動設備所連接的局網(wǎng)內(nèi)存在socket的服務端,服務端就會接收到客戶端發(fā)出的廣播,然后服務端再通過接收到的IP與客戶端進行連接進而就可以進行控制及文件的傳輸了。需要注意的是,udp廣播會導致局網(wǎng)傳輸速度變慢,而且udp為不可靠協(xié)議,發(fā)出的廣播服務端不一定都能夠收到,所以在實際情況中需要做很多邏輯處理,比如在線程里發(fā)廣播直到收到服務端的回應 但如果局網(wǎng)內(nèi)不存在服務端就會陷入死循環(huán),所以這時就要做限時操作了等等。。。 具體的看個人需求而言了吧。
希望本文所述對大家Android程序設計有所幫助。
- Android Socket通信詳解
- Android編程之客戶端通過socket與服務器通信的方法
- Android中Socket通信的實現(xiàn)方法概述
- Android中使用WebSocket實現(xiàn)群聊和消息推送功能(不使用WebView)
- Android NDK中socket的用法以及注意事項分析
- python服務器與android客戶端socket通信實例
- android開發(fā)socket編程之udp發(fā)送實例分析
- Android中使用socket通信實現(xiàn)消息推送的方法詳解
- Android使用socket創(chuàng)建簡單TCP連接的方法
- Android socket實現(xiàn)原理詳解 服務端和客戶端如何搭建
相關(guān)文章
Android Drawable及其相關(guān)類的使用
本文主要講解Android Drawable,這里整理了Drawable 的文檔資料和實例代碼以及實現(xiàn)效果圖,有需要的小伙伴可以參考下2016-08-08
玩轉(zhuǎn)AppBarLayout實現(xiàn)更酷炫的頂部欄
玩轉(zhuǎn)AppBarLayout,實現(xiàn)更酷炫的頂部欄,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-09-09
Android編程程序?qū)崿F(xiàn)一鍵鎖屏的方法講解
今天小編就為大家分享一篇關(guān)于Android編程程序?qū)崿F(xiàn)一鍵鎖屏的方法講解,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-03-03
用Eclipse搭建Android開發(fā)環(huán)境并創(chuàng)建第一個Android項目(eclipse+android sdk)
這篇文章主要介紹了用Eclipse搭建Android開發(fā)環(huán)境并創(chuàng)建第一個Android項目,需要的朋友可以參考下2015-09-09
Android簡單實現(xiàn) 緩存數(shù)據(jù)
這篇文章主要介紹了Android簡單實現(xiàn) 緩存數(shù)據(jù),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-11-11
Android開發(fā)組件化架構(gòu)設計原理到實戰(zhàn)
這篇文章主要為大家介紹了Android開發(fā)組件化架構(gòu)設計原理到實戰(zhàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-06-06

