android 通过局域网udp广播自动建立socket连接

http://blog.csdn.net/luoboo525/article/details/7878395


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

  1. public class MainActivity extends Activity implements Runnable {  
  2.     private MulticastSocket ds;  
  3.     String multicastHost="224.0.0.1";  
  4.     InetAddress receiveAddress;  
  5.   
  6.     @Override  
  7.     public void onCreate(Bundle savedInstanceState) {  
  8.         super.onCreate(savedInstanceState);  
  9.         setContentView(R.layout.main);  
  10.         try {  
  11.             ds = new MulticastSocket(8003);  
  12.             receiveAddress=InetAddress.getByName(multicastHost);  
  13.             ds.joinGroup(receiveAddress);  
  14.             new Thread(this).start();  
  15.         } catch (Exception e1) {  
  16.             // TODO Auto-generated catch block  
  17.             e1.printStackTrace();  
  18.         }  
  19.     }  
  20.   
  21.     @Override  
  22.     public void run() {  
  23.         // TODO Auto-generated method stub  
  24.         byte buf[] = new byte[1024];  
  25.         DatagramPacket dp = new DatagramPacket(buf, 1024);  
  26.         while (true) {  
  27.             try {  
  28.                 ds.receive(dp);  
  29.                 //Toast.makeText(this, new String(buf, 0, dp.getLength()), Toast.LENGTH_LONG);  
  30.                 System.out.println("client ip : "+new String(buf, 0, dp.getLength()));  
  31.             } catch (Exception e) {  
  32.                 e.printStackTrace();  
  33.             }  
  34.         }  
  35.     }  
  36. }  
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为不可靠协议,发出的广播服务端不一定都能够收到,所以在实际情况中需要做很多逻辑处理,比如在线程里发广播直到收到服务端的回应 但如果局网内不存在服务端就会陷入死循环,所以这时就要做限时操作了等等。。。  具体的看个人需求而言了吧。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值