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

本文实例讲述了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程序设计有所帮助。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索android
, 局域网
, udp广播
socket连接
qt udp socket编程、linux udp socket编程、socket udp编程、java udp socket编程、mfc udp socket编程,以便于您获取更多的相关知识。

时间: 2024-10-29 14:31:32

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

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

本文实例讲述了Android编程实现基于局域网udp广播自动建立socket连接的方法.分享给大家供大家参考,具体如下: android开发中经常会用到socket通讯.由于项目需要,最近研究了一下这方面的知识. 需求是想通过wifi实现android移动设备和android平台的电视之间的文件传输与控制. 毫无疑问这中间一定需要用到socket来进行通信.今天就两台设备的握手连接方式分享一下吧,该方法只是本人个人想法的实现,仅供参考,如有雷同,不胜荣幸. 要想使用socket进行通讯,就必须知

Android编程获取包名,版本信息及VersionName名称的方法_Android

本文实例讲述了Android编程获取包名,版本信息及VersionName名称的方法.分享给大家供大家参考,具体如下: 话不多说,直接上代码,此处,主要是在版本升级的时候,使用较多. private String getAppInfo() { try { String pkName = this.getPackageName(); String versionName = this.getPackageManager().getPackageInfo( pkName, 0).versionNam

Android编程简单实现ImageView点击时背景图修改的方法_Android

本文实例讲述了Android编程简单实现ImageView点击时背景图修改的方法.分享给大家供大家参考,具体如下: 在使用ImageView时,当被点击时,希望背景图修改一下,这样显示被点击效果明显一些.在这里,一个很简单的方法,最起码是个很清晰的方法.在res/drawable文件夹下创建一个xml文件.比如my.xml,内容如下: <?xml version="1.0" encoding="utf-8"?> <selector xmlns:an

android编程开发之全屏和退出全屏的实现方法_Android

本文实例讲述了android编程开发之全屏和退出全屏的实现方法.分享给大家供大家参考,具体如下: xml代码: <Button android:id="@+id/button5" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/fullscreen" android:onClick

Android编程实现自动调整TextView字体大小以适应文字长度的方法_Android

本文实例讲述了Android编程实现自动调整TextView字体大小以适应文字长度的方法.分享给大家供大家参考,具体如下: package com.test.android.textview; import android.content.Context; import android.graphics.Paint; import android.util.AttributeSet; import android.widget.TextView; public class CustomTextV

Android编程实现Gallery中每次滑动只显示一页的方法_Android

本文实例讲述了Android编程实现Gallery中每次滑动只显示一页的方法.分享给大家供大家参考,具体如下: import android.content.Context; import android.util.AttributeSet; import android.view.KeyEvent; import android.view.MotionEvent; import android.widget.Gallery; public class DetialGallery extends

Android编程判断SD卡是否存在及使用容量查询实现方法_Android

本文实例讲述了Android编程判断SD卡是否存在及使用容量查询实现方法.分享给大家供大家参考,具体如下: 1.判断SD卡是否存在 返回true表示存在 /* 判断SD卡是否存在 返回true表示存在 */ public boolean avaiableMedia() { String status = Environment.getExternalStorageState(); if (status.equals(Environment.MEDIA_MOUNTED)) { return tru

Android编程实现将压缩数据库文件拷贝到安装目录的方法_Android

本文实例讲述了Android编程实现将压缩数据库文件拷贝到安装目录的方法.分享给大家供大家参考,具体如下: public void copyZip2DataDirectory(Context context) throws IOException { FileOutputStream outputStream = null; AssetManager assetManager = context.getAssets(); InputStream inputStream = assetManage

Android编程实现ViewPager多页面滑动切换及动画效果的方法_Android

本文实例讲述了Android编程实现ViewPager多页面滑动切换及动画效果的方法.分享给大家供大家参考,具体如下: 一.首先,我们来看一下效果图,这是新浪微博的Tab滑动效果.我们可以手势滑动,也可以点击上面的头标进行切换.与此同方式, 白色横条会移动到相应的页卡头标下.这是一个动画效果,白条是缓慢滑动过去的.好了,接下来我们就来实现它. 二.在开始前,我们先要认识一个控件,ViewPager.它是google SDk中自带的一个附加包的一个类,可以用来实现屏幕间的切换. 这个附加包是and