一、UDP协议全称是用户数据报协议 ,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。

1、UDP是一个无连接协议,传输数据之前源端和终端不建立连接;

2、不维护连接状态,包括收发状态等,因此一台服务机可同时向多个客户机传输相同的消息;

3、UDP信息包的标题很短,8个字节,对于TCP的20个字节信息包的额外开销很小;

4、吞吐量不受拥挤控制算法的调节,只受应用软件生成数据的速率、传输带宽、源端和终端主机性能的限制;

5、不保证可靠交付;

6、UDP是面向报文的。

二、UDP的代码编程需要用到DatagramSocket类,Java使用DatagramSocket代表UDP协议的Socket,先了解一下如何使用这个类。

server服务端(接收数据方)创建步骤

1、生成DatagramSocket对象,参数为端口号

  1. DatagramSocket socket = new  DatagramSocket (8888);

2、byte数组用来接收数据

  1. byte data[] = new byte[1024];

3、DatagramPackage以包形式装载byte数组

  1. DatagramPacket packet = new DatagramPacket(data, data.length);

4、使用DatagramPacket的receive方法接收发送方所发送的数据,是一个阻塞的方法

  1. socket.receive(packet);

5、接收到的数据转变化成可读字符串

  1. String result = new String(packet.getData(), packet.getOffset(), packet.getLength());

client客户端(发送数据方)创建步骤

1、生成DatagramSocket对象,参数为端口号

  1. DatagramSocket socket = new DatagramSocket (8888);

2、创建一个InetAddress对象,用于确定server客户端(数据接收方),参数为IP地址,如我的IP地址为192.168.1.103

  1. InetAddress serverAddress = InetAddress.getByName("192.168.1.103");

3、需要发送的数据转化为byte数组

  1. String sendData= "hello word";
  2. byte data[] = sendData.getBytes();

4、生成一个DatagramPacket对象,包含需要发送的byte数组,byte数组长度,已设置IP地址的serverAddress,和服务端一致的端口号(这里是8888)

  1. DatagramPacket packet = new DatagramPacket(data, data.length, serverAddress, 8888);

5、发送数据,调用DatagramSocket对象的send方法

  1. socket.send(packet);

三、代码demo演示

server服务端,可以直接运行在eclipse即可

  1. import java.io.IOException;
  2. import java.net.DatagramPacket;
  3. import java.net.DatagramSocket;
  4.  
  5. public class UDPServer {
  6. public static void main(String[] args) throws IOException {
  7. DatagramSocket socket = null;
  8. try {
  9. socket = new DatagramSocket(8888);
  10. } catch (Exception e) {
  11. e.printStackTrace();
  12. }
  13. while (true) {
  14. byte data[] = new byte[1024];
  15. DatagramPacket packet = new DatagramPacket(data, data.length);
  16. socket.receive(packet);
  17. String result = new String(packet.getData(), packet.getOffset(), packet.getLength());
  18. System.out.println("receive client's data: " + result);
  19. }
  20. }
  21. }

若多次运行会提示错误:Address already in use: Cannot bind,关掉之前开启的即可。

Android客户端代码demo演示,需要注意的是端口号是与服务端一致的,IP地址是服务端的IP地址。

  1. import android.app.Activity;
  2. import java.net.DatagramPacket;
  3. import java.net.DatagramSocket;
  4. import java.net.InetAddress;
  5. import android.os.Bundle;
  6. import android.view.View;
  7. import android.view.View.OnClickListener;
  8. import android.widget.Button;
  9.  
  10. public class UDPActivity extends Activity {
  11. private Button bt_send_data = null;
  12. DatagramSocket socket = null;
  13. InetAddress serverAddress = null;
  14. @Override
  15. public void onCreate(Bundle savedInstanceState) {
  16. super.onCreate(savedInstanceState);
  17. bt_send_data = new Button(this);
  18. bt_send_data.setText("发送");
  19. setContentView(bt_send_data);
  20. try {
  21. socket = new DatagramSocket(8888);
  22. serverAddress = InetAddress.getByName("192.168.1.101");
  23. } catch (Exception e) {
  24. e.printStackTrace();
  25. }
  26. bt_send_data.setOnClickListener(new OnClickListener() {
  27. @Override
  28. public void onClick(View arg0) {
  29. new Thread(new Runnable() {
  30. @Override
  31. public void run() {
  32. try {
  33. String sendData = "hello world";
  34. byte data[] = sendData.getBytes();
  35. DatagramPacket packet = new DatagramPacket(data, data.length, serverAddress, 8888);
  36. socket.send(packet);
  37. } catch (Exception e) {
  38. e.printStackTrace();
  39. }
  40. }
  41. }).start();
  42. }
  43. });
  44. }
  45. }

在AndroidManifest.xml添加权限和注册

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="com.libill.demos"
  4. android:versionCode="1"
  5. android:versionName="1.0" >
  6. <uses-sdk
  7. android:minSdkVersion="8"
  8. android:targetSdkVersion="10" />
  9. <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
  10. <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
  11. <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
  12. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
  13. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
  14. <uses-permission android:name="android.permission.INTERNET"/>
  15. <application
  16. android:allowBackup="true"
  17. android:icon="@drawable/ic_launcher"
  18. android:label="@string/app_name"
  19. android:theme="@style/AppStartTheme" >
  20. <activity
  21. android:name="com.liqw.demos.activity.UDPServerActivity"
  22. android:label="@string/app_name" >
  23. <intent-filter>
  24. <action android:name="android.intent.action.MAIN" />
  25. <category android:name="android.intent.category.LAUNCHER" />
  26. </intent-filter>
  27. </activity>
  28. </application>
  29. </manifest>

这样即可跑起demo做测试了。先运行服务端,再点击发送4次,服务端的log如下:

参考博客:

http://www.cnblogs.com/lee0oo0/archive/2012/04/04/2431907.html

http://wang09si.blog.163.com/blog/static/170171804201303004343304/

Android UDP的更多相关文章

  1. android udp 无法收到数据 (模拟器中)

    解决方法:1. 运行模拟器2. 打开window 命令行执行:telnet localhost 55545554是模拟器的端口,执行之后会进入android console3. 在console下执行 ...

  2. Android udp json+数组 --->bytes发送数据

    Android  json支持五种数据类型 String / int(float)/bool / null  / object 今天说 object  : json = new JSONObject( ...

  3. 【原创】NIO框架入门(四):Android与MINA2、Netty4的跨平台UDP双向通信实战

    概述 本文演示的是一个Android客户端程序,通过UDP协议与两个典型的NIO框架服务端,实现跨平台双向通信的完整Demo. 当前由于NIO框架的流行,使得开发大并发.高性能的互联网服务端成为可能. ...

  4. [书目20160624]Android应用开发从入门到精通

    卢海东 著 第1章 揭开神秘面纱——Android系统简介 1   1.1 认识Android系统 2   1.1.1 Android成长历程 2   1.1.2 发行版本 3   1.1.3 得到大 ...

  5. android firmware 利用UDP socket发送Magic Packet--python版本

    android firmware 利用UDP socket发送Magic Packet--python版本 #!/usr/bin/python import sys, time from struct ...

  6. android firmware 利用UDP socket发送Magic Packet--c语言版本

    android firmware 利用UDP socket发送Magic Packet 1 Magic Packet格式: 6个0xFF + 16个Dst Mac Address 2 代码需要设置目的 ...

  7. Android杂谈--HTC等手机接收不到UDP广播报文的解决方案

    最近遇到个问题,在android手机上发送UDP报文的时候,HTC等机型(测试用HTC new one)接收不到广播报文,而其他的samsung, huawei, xiaomi, nexus等等均没有 ...

  8. Android视频直播解决方案(rstp、udp)

    做局域网视频直播有两种方案,通过rstp或udp协议. 1.rstp协议,网络上有个开源项目,基于Android,且这个项目也是一个服务端,里面也集成了http访问页面,可以通过http或者rstp直 ...

  9. Socket 通信原理(Android客户端和服务器以TCP&&UDP方式互通)

    转载地址:http://blog.csdn.net/mad1989/article/details/9147661 ZERO.前言 有关通信原理内容是在网上或百科整理得到,代码部分为本人所写,如果不当 ...

随机推荐

  1. apue第四章学习总结

    apue第四章学习总结 4.1.若以stat函数去替换lstat函数,会发生: 原来的目录路径: $:~/workspace/apue2/include$ ls -l apue.h abc lrwxr ...

  2. 关于windows系统下 webpack的使用

    最近包子在研究webpack打包,发现,真是个好东西,以前完全不懂,其实很简单,步骤如下: 1.安装webpack嘎嘎嘎嘎~~~ 2.初始化一下 3.这玩意是啥,我不知道,就依葫芦画瓢 4.这玩意是啥 ...

  3. tyvj3481 越狱

    描述 监狱有连续编号为1...N的N个房间,每个房间关押一个犯人,有M种宗教,每个犯人可能信仰其中一种.如果相信房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱 输入格式 输入两个整数 ...

  4. AJAX创建表格,删除数据

    主页面 <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8 ...

  5. redis和memcached比较

    1.Memcached采用客户端-服务器的架构,服务器维护了一个键-值关系的数据表,服务器之间相互独立,互相之间不共享数据也不做任何通讯操作.客户端需要知道所有的服务器,并自行负责管理数据在各个服务器 ...

  6. [BZOJ1786][BZOJ1831]逆序对

    [BZOJ1786][BZOJ1831]逆序对 试题描述 输入 输出 输入示例 - - 输出示例 数据规模及约定 见“输入” 题解 首先这题有一个性质,即,填的数从左到右一定不降.证明不妨读者自己yy ...

  7. [ruby on rails] 跟我学之(4)路由映射

    前面<[ruby on rails] 跟我学之Hello World>提到,路由对应的文件是 config/routes.rb 实际上我们只是添加了一句代码: resources :pos ...

  8. http://www.highcharts.com/

    MAKE YOUR DATA COME ALIVE HIGHCHARTS CLOUD Online charts for non-techies. Create smashing, interacti ...

  9. order by 指定顺序 mysql

    LOCATE(substr,str), LOCATE(substr,str,pos) 第一个语法返回字符串str第一次出现的子串SUBSTR的位置.第二个语法返回第一次出现在字符串str的子串SUBS ...

  10. Java for LeetCode 039 Combination Sum

    Given a set of candidate numbers (C) and a target number (T), find all unique combinations in C wher ...