zoukankan      html  css  js  c++  java
  • 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:SurfaceView和View 区别
    放下这8件事 就离成功不远了
    Android 的参考资料地址
    Java内存分配原理(二)
    J2ME最佳实践之联网开发编写反应灵敏的联网提示界面
    [转载]正则表达式学习
    Java内存分配原理(三)
    flashpaper2.2 asp.net win2003 iis 配置解决方案
    ubuntu ip地址,jdk,ssh配置
    office 2007 打开xls提示格式不正确
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/7139917.html
Copyright © 2011-2022 走看看