广

android开发

  • IOS开发
  • android开发
  • PHP编程
  • JavaScript
  • ASP.NET
  • ASP编程
  • JSP编程
  • Java编程
  • 易语言
  • Ruby编程
  • Perl编程
  • AJAX
  • 正则表达式
  • C语言
  • 编程开发

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

    2018-04-13 09:16:48 次阅读 稿源:互联网
    广告

    什么是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打印出来的服务器端信息:

    一起学吧部分文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与一起学吧进行文章共享合作。

    广告
    广告
    广告