編輯:關於Android編程
本文實例講述了Android編程實現基於局域網udp廣播自動建立socket連接的方法。分享給大家供大家參考,具體如下:
android開發中經常會用到socket通訊。由於項目需要,最近研究了一下這方面的知識。 需求是想通過wifi實現android移動設備和android平台的電視之間的文件傳輸與控制。 毫無疑問這中間一定需要用到socket來進行通信。今天就兩台設備的握手連接方式分享一下吧,該方法只是本人個人想法的實現,僅供參考,如有雷同,不勝榮幸。
要想使用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程序設計有所幫助。
Android插件化探索(三)免安裝運行Activity(上)
前情提要在上一篇中有一個細節沒有提到,那就是getResourcesForApplication和AssetManager的區別。getResourcesForAppli
Android程序開發之UIScrollerView裡有兩個tableView
一,效果圖。二,工程圖。 三,代碼。RootViewController.h#import <UIKit/UIKit.h>@interface Ro
手機百度浏覽器怎麼清除地址欄輸入歷史教程
手機百度浏覽器怎麼清除地址欄輸入歷史教程。我們在使用手機百度浏覽器的時候,之前輸入很多地址。都被保存下來。可我想清除這手機百度浏覽器的地址欄輸入歷史,不想它
Android常用控件之下拉刷新Wifi列表
有些列表信息需要手動去更新,此時比較常用的就是下拉刷新列表,在這裡就使用下拉列表來刷新當前Wifi信息 目錄結構 界面 關鍵代碼 下拉列表類 p