Android编程实现基于局域网udp广播自动建立socket连接的方法
本文实例讲述了Android编程实现基于局域网udp广播自动建立socket连接的方法。分享给大家供大家参考,具体如下:
android开发中经常会用到socket通讯。由于项目需要,最近研究了一下这方面的知识。需求是想通过wifi实现android移动设备和android平台的电视之间的文件传输与控制。毫无疑问这中间一定需要用到socket来进行通信。今天就两台设备的握手连接方式分享一下吧,该方法只是本人个人想法的实现,仅供参考,如有雷同,不胜荣幸。
要想使用socket进行通讯,就必须知道服务端的IP地址,我使用的是通过udp局网广播来实现局网内服务端的搜寻建立连接。以下是代码实现。
首先是客户端:
publicclassMainActivityextendsActivity{
/*发送广播端的socket*/
privateMulticastSocketms;
/*发送广播的按钮*/
privateButtonsendUDPBrocast;
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
init();
}
/*初始化参数*/
publicvoidinit(){
setContentView(R.layout.main);
sendUDPBrocast=(Button)findViewById(R.id.send);
sendUDPBrocast.setOnClickListener(newSendUDPBrocastListener());
try{
/*创建socket实例*/
ms=newMulticastSocket();
}catch(Exceptione){
e.printStackTrace();
}
}
/**
*单击按钮时,发送局域网广播
**/
classSendUDPBrocastListenerimplementsOnClickListener{
@Override
publicvoidonClick(Viewv){
//发送的数据包,局网内的所有地址都可以收到该数据包
DatagramPacketdataPacket=null;
try{
ms.setTimeToLive(4);
//将本机的IP(这里可以写动态获取的IP)地址放到数据包里,其实server端接收到数据包后也能获取到发包方的IP的
byte[]data="192.168.1.101".getBytes();
//224.0.0.1为广播地址
InetAddressaddress=InetAddress.getByName("224.0.0.1");
//这个地方可以输出判断该地址是不是广播类型的地址
System.out.println(address.isMulticastAddress());
dataPacket=newDatagramPacket(data,data.length,address,
8003);
ms.send(dataPacket);
ms.close();
}catch(Exceptione){
e.printStackTrace();
}
}
}
}
以下是服务端:
publicclassMainActivityextendsActivityimplementsRunnable{
privateMulticastSocketds;
StringmulticastHost="224.0.0.1";
InetAddressreceiveAddress;
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
try{
ds=newMulticastSocket(8003);
receiveAddress=InetAddress.getByName(multicastHost);
ds.joinGroup(receiveAddress);
newThread(this).start();
}catch(Exceptione1){
//TODOAuto-generatedcatchblock
e1.printStackTrace();
}
}
@Override
publicvoidrun(){
//TODOAuto-generatedmethodstub
bytebuf[]=newbyte[1024];
DatagramPacketdp=newDatagramPacket(buf,1024);
while(true){
try{
ds.receive(dp);
//Toast.makeText(this,newString(buf,0,dp.getLength()),Toast.LENGTH_LONG);
System.out.println("clientip:"+newString(buf,0,dp.getLength()));
}catch(Exceptione){
e.printStackTrace();
}
}
}
}
这样一来如果移动设备所连接的局网内存在socket的服务端,服务端就会接收到客户端发出的广播,然后服务端再通过接收到的IP与客户端进行连接进而就可以进行控制及文件的传输了。需要注意的是,udp广播会导致局网传输速度变慢,而且udp为不可靠协议,发出的广播服务端不一定都能够收到,所以在实际情况中需要做很多逻辑处理,比如在线程里发广播直到收到服务端的回应但如果局网内不存在服务端就会陷入死循环,所以这时就要做限时操作了等等。。。具体的看个人需求而言了吧。
希望本文所述对大家Android程序设计有所帮助。
热门推荐
10 八一幼儿祝福语大全简短
11 公司乔迁食堂祝福语简短
12 婚礼结束聚餐祝福语简短
13 儿媳买车妈妈祝福语简短
14 毕业送礼老师祝福语简短
15 同事辞职正常祝福语简短
16 恭贺新婚文案祝福语简短
17 金店立秋祝福语简短英文
18 婆婆高寿祝福语大全简短