首页 > 系统 > Android > 正文

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

2019-10-24 20:34:43
字体:
来源:转载
供稿:网友

这篇文章主要介绍了Android编程实现基于局域网udp广播自动建立socket连接的方法,涉及Android使用udp广播实现socket通讯的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下

本文实例讲述了Android编程实现基于局域网udp广播自动建立socket连接的方法。分享给大家供大家参考,具体如下:

android开发中经常会用到socket通讯。由于项目需要,最近研究了一下这方面的知识。 需求是想通过wifi实现android移动设备和android平台的电视之间的文件传输与控制。 毫无疑问这中间一定需要用到socket来进行通信。今天就两台设备的握手连接方式分享一下吧,该方法只是本人个人想法的实现,仅供参考,如有雷同,不胜荣幸。

要想使用socket进行通讯,就必须知道服务端的IP地址,我使用的是通过udp局网广播来实现局网内服务端的搜寻建立连接。以下是代码实现。

首先是客户端:

 

 
  1. public class MainActivity extends Activity {  
  2. /*发送广播端的socket*/  
  3. private MulticastSocket ms;  
  4. /*发送广播的按钮*/  
  5. private Button sendUDPBrocast;  
  6. @Override  
  7. public void onCreate(Bundle savedInstanceState) {  
  8. super.onCreate(savedInstanceState);  
  9. init();  
  10. }  
  11. /*初始化参数*/  
  12. public void init() {  
  13. setContentView(R.layout.main);  
  14. sendUDPBrocast = (Button) findViewById(R.id.send);  
  15. sendUDPBrocast.setOnClickListener(new SendUDPBrocastListener());  
  16. try {  
  17. /*创建socket实例*/  
  18. ms = new MulticastSocket();  
  19. catch (Exception e) {  
  20. e.printStackTrace();  
  21. }  
  22. }  
  23. /**  
  24. * 单击按钮时,发送局域网广播  
  25. * */ 
  26. class SendUDPBrocastListener implements OnClickListener{  
  27. @Override 
  28. public void onClick(View v) {  
  29. //发送的数据包,局网内的所有地址都可以收到该数据包  
  30. DatagramPacket dataPacket = null;  
  31. try {  
  32. ms.setTimeToLive(4);  
  33. //将本机的IP(这里可以写动态获取的IP)地址放到数据包里,其实server端接收到数据包后也能获取到发包方的IP的  
  34. byte[] data = "192.168.1.101".getBytes();  
  35. //224.0.0.1为广播地址  
  36. InetAddress address = InetAddress.getByName("224.0.0.1");  
  37. //这个地方可以输出判断该地址是不是广播类型的地址  
  38. System.out.println(address.isMulticastAddress());  
  39. dataPacket = new DatagramPacket(data, data.length, address,  
  40. 8003);  
  41. ms.send(dataPacket);  
  42. ms.close();  
  43. catch (Exception e) {  
  44. e.printStackTrace();  
  45. }  
  46. }  
  47. }  
  48. }  

以下是服务端:

 

 
  1. public class MainActivity extends Activity implements Runnable {  
  2. private MulticastSocket ds;  
  3. String multicastHost="224.0.0.1";  
  4. InetAddress receiveAddress;  
  5. @Override 
  6. public void onCreate(Bundle savedInstanceState) {  
  7. super.onCreate(savedInstanceState);  
  8. setContentView(R.layout.main);  
  9. try {  
  10. ds = new MulticastSocket(8003);  
  11. receiveAddress=InetAddress.getByName(multicastHost);  
  12. ds.joinGroup(receiveAddress);  
  13. new Thread(this).start();  
  14. catch (Exception e1) {  
  15. // TODO Auto-generated catch block  
  16. e1.printStackTrace();  
  17. }  
  18. }  
  19. @Override 
  20. public void run() {  
  21. // TODO Auto-generated method stub  
  22. byte buf[] = new byte[1024];  
  23. DatagramPacket dp = new DatagramPacket(buf, 1024);  
  24. while (true) {  
  25. try {  
  26. ds.receive(dp);  
  27. //Toast.makeText(this, new String(buf, 0, dp.getLength()), Toast.LENGTH_LONG);  
  28. System.out.println("client ip : "+new String(buf, 0, dp.getLength()));  
  29. catch (Exception e) {  
  30. e.printStackTrace();  
  31. }  
  32. }  
  33. }  

这样一来如果移动设备所连接的局网内存在socket的服务端,服务端就会接收到客户端发出的广播,然后服务端再通过接收到的IP与客户端进行连接进而就可以进行控制及文件的传输了。需要注意的是,udp广播会导致局网传输速度变慢,而且udp为不可靠协议,发出的广播服务端不一定都能够收到,所以在实际情况中需要做很多逻辑处理,比如在线程里发广播直到收到服务端的回应 但如果局网内不存在服务端就会陷入死循环,所以这时就要做限时操作了等等。。。 具体的看个人需求而言了吧。

希望本文所述对大家Android程序设计有所帮助。


注:相关教程知识阅读请移步到Android开发频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表