android 通过局域网udp广播自动建立socket连接
来源:互联网 发布:如何做一个淘宝客服 编辑:程序博客网 时间:2024/05/19 12:25
http://blog.csdn.net/luoboo525/article/details/7878395
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 {/*发送广播端的socket*/private MulticastSocket ms;/*发送广播的按钮*/private Button sendUDPBrocast;@Overridepublic 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{@Overridepublic 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();
- }
- }
- }
- }
public class MainActivity extends Activity implements Runnable {private MulticastSocket ds;String multicastHost="224.0.0.1";InetAddress receiveAddress;@Overridepublic 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 blocke1.printStackTrace();}}@Overridepublic void run() {// TODO Auto-generated method stubbyte 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 通过局域网udp广播自动建立socket连接
- android 通过局域网udp广播自动建立socket连接
- android 通过局域网udp广播自动建立socket连接
- android UDP多点广播,并自动建立Socket连接
- android UDP多点广播,并自动建立Socket连接
- android UDP多点广播,并自动建立Socket连接
- android UDP多点广播,并自动建立Socket连接
- Android 通过UDP广播建立Socket
- android 发送UDP广播,搜寻服务器建立socket链接
- Delphi用Socket IP/UDP局域网广播
- 通过UDP建立TCP连接
- 通过UDP广播自动获取IP地址
- Android中通过socket建立长连接实现推送功能
- socket的局域网广播
- socket的局域网广播
- socket的局域网广播
- Android扫描局域网内IP并建立Socket连接,和PC服务端收发数据
- C#实现局域网UDP广播
- DSP中的Mailbox的学习-dm642
- httpClient 教程
- Bootm的流程分析
- 那短短几百米的距离,我用了3年的时间来走完(非技术贴)
- HDU 2594 Simpsons’ Hidden Talents(KMP)
- android 通过局域网udp广播自动建立socket连接
- 嵌入式软件开发必读的圣经
- 用while语句计算并输出1/3-3/5+5/7...-19/21的结果(第十周上机任务)
- 提高sql语句查询效率的方法
- java项目开发时热部署--jrebel+myeclipse配置
- APPLET和HTML作为客户端的比较
- C/C++ 开发库 | C/C++ Development Library
- 10596 - Morning Walk
- 统计一个整数n的二进制表示中1的个数的几种解法