博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 通过局域网udp广播自动建立socket连接
阅读量:5989 次
发布时间:2019-06-20

本文共 3153 字,大约阅读时间需要 10 分钟。

开发中经常会用到socket通讯。由于项目需要,最近研究了一下这方面的知识。 需求是想通过wifi实现移动设备和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为不可靠协议,发出的广播服务端不一定都能够收到,所以在实际情况中需要做很多逻辑处理,比如在线程里发广播直到收到服务端的回应 但如果局网内不存在服务端就会陷入死循环,所以这时就要做限时操作了等等

转载地址:http://uojlx.baihongyu.com/

你可能感兴趣的文章
BeanUtils框架的简单运用
查看>>
java代理模式及动态代理类
查看>>
Android开发中Handler的经典总结
查看>>
Maven入门详解
查看>>
ArcGIS for Desktop入门教程_第六章_用ArcMap制作地图 - ArcGIS知乎-新一代ArcGIS问答社区...
查看>>
vs2008 C# 怎么调试C++ dll
查看>>
Android通过tcpdump抓包
查看>>
虚拟现实及增强现实(眼镜或头盔)现状与未来-基本介绍
查看>>
TCP 连接建立和断开,以及状态转换
查看>>
WebStorm: The Smartest JavaScript IDE by JetBrains
查看>>
How To Install Python 2.7 with mod_wsgi on CentOS 5.6 with cPanel
查看>>
炮灰模型——女生选择追求者模型
查看>>
ajax基本用法
查看>>
powershell 查看程序的tcp网络连接
查看>>
j2ee开发中的“java容器”和“web容器”有什么区别?
查看>>
linux源码分析(三)-start_kernel
查看>>
C# System.IO.FileStream 文件正由另一进程使用,因此该进程无法访问该文件
查看>>
safeNet
查看>>
解决vim粘贴时格式混乱的问题
查看>>
使用ViewBag传送数据从控制器至视图
查看>>