Android网络编程之UDP通信模型实例

 更新时间:2014年10月10日 13:21:26   投稿:junjie  
这篇文章主要介绍了Android网络编程之UDP通信模型实例,本文给出了服务端代码和客户端代码,需要的朋友可以参考下

什么是Android UDP?

UDP是User Datagram Protocol的简称,中文名是用户数据包协议,是OSI参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。它是IETF RFC 768是UDP的正式规范。在网络中它与TCP协议一样用于处理数据包。在OSI模型中,在第四层-传输层,处于IP协议的上一层。UDP有不提供数据报分组、组装和不能对数据包的排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。UDP用来支持那些需要在计算机之间传输数据的网络应用。包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都需要使用UDP协议。UDP协议从问世至今已经被使用了很多年,虽然其最初的光彩已经被一些类似协议所掩盖,但是即使是在今天,UDP仍然不失为一项非常实用和可行的网络传输层协议。

与所熟知的TCP(传输控制协议)协议一样,UDP协议直接位于IP(网际协议)协议的顶层。根据OSI(开放系统互连)参考模型,UDP和TCP都属于传输层协议。

UDP协议的主要作用是将网络数据流量压缩成数据报的形式。一个典型的数据报就是一个二进制数据的传输单位。每一个数据报的前8个字节用来包含报头信息,剩余字节则用来包含具体的传输数据。

TCP和UDP在android中的使用和在Java里是完全一样的。

服务端:

复制代码 代码如下:

package com.cheerchip.core;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

import android.util.Log;

public class UDPServer implements Runnable {

 private static final int PORT = 6000;

 private byte[] msg = new byte[1024];

 private boolean life = true;

 public UDPServer() {
 }

 /**
  * @return the life
  */
 public boolean isLife() {
  return life;
 }

 /**
  * @param life
  *            the life to set
  */
 public void setLife(boolean life) {
  this.life = life;
 }

 @Override
 public void run() {
  DatagramSocket dSocket = null;
  DatagramPacket dPacket = new DatagramPacket(msg, msg.length);
  try {
   dSocket = new DatagramSocket(PORT);
   while (life) {
    try {
     dSocket.receive(dPacket);
     Log.i("msg sever received", new String(dPacket.getData()));
    } catch (IOException e) {
     e.printStackTrace();
    }
   }
  } catch (SocketException e) {
   e.printStackTrace();
  }
 }
}

客户端:

复制代码 代码如下:

package com.cheerchip.core;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;
import java.net.UnknownHostException;

public class UDPClient {

 private static final int SERVER_PORT = 6000;

 private DatagramSocket dSocket = null;

 private String msg;

 /**
  * @param msg
  */
 public UDPClient(String msg) {
  super();
  this.msg = msg;
 }

 /**
  * 发送信息到服务器
  */
 public String send() {
  StringBuilder sb = new StringBuilder();
  InetAddress local = null;
  try {
   local = InetAddress.getByName("localhost"); // 本机测试
   sb.append("已找到服务器,连接中...").append("/n");
  } catch (UnknownHostException e) {
   sb.append("未找到服务器.").append("/n");
   e.printStackTrace();
  }
  try {
   dSocket = new DatagramSocket(); // 注意此处要先在配置文件里设置权限,否则会抛权限不足的异常
   sb.append("正在连接服务器...").append("/n");
  } catch (SocketException e) {
   e.printStackTrace();
   sb.append("服务器连接失败.").append("/n");
  }
  int msg_len = msg == null ? 0 : msg.length();
  DatagramPacket dPacket = new DatagramPacket(msg.getBytes(), msg_len,
    local, SERVER_PORT);
  try {
   dSocket.send(dPacket);
   sb.append("消息发送成功!").append("/n");
  } catch (IOException e) {
   e.printStackTrace();
   sb.append("消息发送失败.").append("/n");
  }
  dSocket.close();
  return sb.toString();
 }

}

主Activity:

复制代码 代码如下:

public class MainAct extends Activity {

 EditText msg_et = null;
 Button send_bt = null;
 TextView info_tv = null;

 @Override
 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);

  msg_et = (EditText) findViewById(R.id.msg_et);
  send_bt = (Button) findViewById(R.id.send_bt);
  info_tv = (TextView) findViewById(R.id.info_tv);

  // 开启服务器
  ExecutorService exec = Executors.newCachedThreadPool();
  UDPServer server = new UDPServer();
  exec.execute(server);

  // 发送消息
  send_bt.setOnClickListener(new OnClickListener() {
   @Override
   public void onClick(View v) {
    UDPClient client = new UDPClient(msg_et.getText().toString());
    info_tv.setText(client.send());
   }
  });
 }
}

注意在配置文件中要加上:

以获取相应的权限。

效果图:

LogCat打印出来的服务器端信息:

相关文章

  • Android  ImageView绘制圆角效果

    Android ImageView绘制圆角效果

    这篇文章主要介绍了Android ImageView绘制圆角效果,一种是使用Xfermode,另一种是BitmapShader来实现圆形和圆角的效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • Android实现图片叠加功能

    Android实现图片叠加功能

    本篇文章主要介绍了Android实现图片叠加功能的代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • Android中Window添加View的底层原理

    Android中Window添加View的底层原理

    这篇文章主要介绍了Android中Window添加View的底层原理,需要的朋友可以参考下
    2016-03-03
  • 详解flutter engine 那些没被释放的东西

    详解flutter engine 那些没被释放的东西

    这篇文章主要介绍了详解flutter engine 那些没被释放的东西,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • Android自定义view实现多色进度条GradientProgressView的绘制

    Android自定义view实现多色进度条GradientProgressView的绘制

    我们常使用shape实现渐变色,但是shape的极限却只有三色,如果有超过三种颜色的View的要求,那么我们就不得不去自定义View来实现这个需求,所以下面我们就来看看如何自定义view实现多色进度条的绘制吧
    2023-08-08
  • Android自定义控件实现九宫格解锁功能

    Android自定义控件实现九宫格解锁功能

    这篇文章主要为大家详细介绍了Android自定义控件实现九宫格解锁功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • Android自定义View绘制的方法及过程(二)

    Android自定义View绘制的方法及过程(二)

    这篇文章主要解析了Android自定义View绘制的方法及过程,介绍了onSizeChanged、onDraw、onMeasure顺序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • android中webview定位问题示例详解

    android中webview定位问题示例详解

    这篇文章主要给大家介绍了关于android中webview定位问题的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
    2017-12-12
  • Android实现双模(CDMA/GSM)手机短信监听的方法

    Android实现双模(CDMA/GSM)手机短信监听的方法

    这篇文章主要介绍了Android实现双模(CDMA/GSM)手机短信监听的方法,涉及Android短信的原理与相关操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2016-06-06
  • 手把手教你用ViewPager自定义实现Banner轮播

    手把手教你用ViewPager自定义实现Banner轮播

    这篇文章主要手把手教你用ViewPager自定义实现Banner轮播,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-09-09

最新评论