当前位置: 移动技术网 > IT编程>移动开发>Android > Android编程实现基于局域网udp广播自动建立socket连接的方法

Android编程实现基于局域网udp广播自动建立socket连接的方法

2019年07月24日  | 移动技术网IT编程  | 我要评论

360的老总,丝薇澜女装,买码网站446123

本文实例讲述了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程序设计有所帮助。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网