2019独角兽企业重金招聘Python工程师标准>>>

一、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

2

String sendData= "hello word";

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

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

import java.io.IOException;

import java.net.DatagramPacket;

import java.net.DatagramSocket;

public class UDPServer {

    public static void main(String[] args) throws IOException {

        DatagramSocket socket = null;

        try {

            socket = new DatagramSocket(8888);

        catch (Exception e) {

            e.printStackTrace();

        }

        while (true) {

            byte data[] = new byte[1024];

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

            socket.receive(packet);

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

            System.out.println("receive client's data: " + result);

        }

    }

}

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

import android.app.Activity;

import java.net.DatagramPacket;

import java.net.DatagramSocket;

import java.net.InetAddress;

import android.os.Bundle;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

public class UDPActivity extends Activity {

    private Button bt_send_data = null;

    DatagramSocket socket = null;

    InetAddress serverAddress = null;

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        bt_send_data = new Button(this);

        bt_send_data.setText("发送");

        setContentView(bt_send_data);

        try {

            socket = new DatagramSocket(8888);

            serverAddress = InetAddress.getByName("192.168.1.101");

        catch (Exception e) {

            e.printStackTrace();

        }

        bt_send_data.setOnClickListener(new OnClickListener() {

            @Override

            public void onClick(View arg0) {

                new Thread(new Runnable() {

                    @Override

                    public void run() {

                        try {

                            String sendData = "hello world";

                            byte data[] = sendData.getBytes();

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

                            socket.send(packet);

                        catch (Exception e) {

                            e.printStackTrace();

                        }

                    }

                }).start();

            }

        });

    }

}

在AndroidManifest.xml添加权限和注册

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

<?xml version="1.0" encoding="utf-8"?>

<manifest xmlns:android="http://schemas.android.com/apk/res/android"

    package="com.libill.demos"

    android:versionCode="1"

    android:versionName="1.0" >

    <uses-sdk

        android:minSdkVersion="8"

        android:targetSdkVersion="10" />

    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>

    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>

    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>

    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>

    <uses-permission android:name="android.permission.INTERNET"/>

    <application

        android:allowBackup="true"

        android:icon="@drawable/ic_launcher"

        android:label="@string/app_name"

        android:theme="@style/AppStartTheme" >

        <activity

            android:name="com.liqw.demos.activity.UDPServerActivity"

            android:label="@string/app_name" >

            <intent-filter>

                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />

            </intent-filter>

        </activity>

    </application>

</manifest>

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

参考博客:

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

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

分类: android

转载于:https://my.oschina.net/u/1177694/blog/3053458

Android UDP相关推荐

  1. android+udp传输大小,Android UDP数据包如何接收可变大小的数据包

    我有一个Android应用程序,它监视UDP数据包并调用一个方法来处理收到的消息.我有一个问题,如果传入的消息更长,它将调用方法来处理消息.但是如果传入的消息较短,则不会调用该方法,但如果我发送短消息 ...

  2. android udp rtp播放器,IjkPlayer For Android(3)-RTP直播硬解码支持

    IjkPlayer播放器其实是支持RTP直播的,但是只能用ffmpeg软解码不能使用硬解码. 这里将会从以下几个方面配置使用 1.UDP RTP/RTMP区别 2.FFMpeg推流 3.IjkPlay ...

  3. android UDP通信

    源代码: MainActivity.java package com.example.udp;import java.net.DatagramPacket; import java.net.Datag ...

  4. android udp 模拟器,android模拟器与PC进行UDP通讯

    模拟器当服务端,PC当客户端java 一.首先要进行端口映射,端口映射的方法:android 利用telnet命令服务器 telnet 127.0.0.1 5554 (链接5554模拟器)ui red ...

  5. android udp 广播通信,Android开启热点进行UDP通信中的坑

    1.写在前面: 2018年的第一篇文章,最近在使用UDP协议进行硬件通信,大家都知道UDP协议通信必须在同一个局域网内,但是每个用户家的wifi都是不一样的,硬件设备是无法只值连接到用户家的wifi的 ...

  6. android udp定时发送,Android Socket基于UDP协议通信

    首先我们要知道UDP通信协议是Socket通信的一种实现方式,Socket通信一般有两种通信方式:基于TCP协议.基于UDP协议.这两者的差别和优缺点就不说了,这里主要讲一下基于UDP协议的实现. 基 ...

  7. android udp 收发例子_网络协议之TCP和UDP

    首先强调一点,TCP/IP协议是一个协议簇.里面包括很多协议的,UDP只是其中的一个, 之所以命名为TCP/IP协议,因为TCP.IP协议是两个很重要的协议,就用他两命名了. 两个协议的区别实际使用时 ...

  8. android udp 设备发现,两台Android设备之间进行UDP连接(使用多播地址)~~求大神指点...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 首先 发送端: package com.example.multicastclient; import android.support.v7.app.Ac ...

  9. Android udp json+数组 ---gt;bytes发送数据

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

最新文章

  1. 使用dokcer搭建个人博客网站
  2. 【GAN优化】详解SNGAN(频谱归一化GAN)
  3. centos7安装、卸载docker (yum方式)
  4. git 在 A 项目中引用 B 项目
  5. 486. Predict the Winner | 486. 预测赢家(博弈论)
  6. source insight 函数不能跳到definition_小技能: Windows10突然不能复制粘贴谁搞鬼
  7. linux 内核3.8,[Beaglebone] BBB迁移到linux 3.8实时内核
  8. 内构函数java_Android JNI参数传递
  9. 少年时对春有感-四季初
  10. 查看oracle 锁定用户名,oracle用户名被锁定
  11. python超时处理_Python如何实现让一个函数超时退出?
  12. python2和python3同时安装
  13. codeplex http://metrotoolkit.codeplex.com/
  14. (day 09 - 递归)剑指 Offer 28. 对称的二叉树
  15. 【8】黑塞矩阵提取图片关键点
  16. 【案例教程不讲废话】Cisco Packet Tracer 思科教程(精+简之快速掌握)一:组建小型局域网
  17. 解决windows7“您可能没有权限使用网络资源”的方法
  18. php智能文章相关性匹配,PHP中的Pearson相关性
  19. HDU 6130 Kolakoski
  20. Chrome 浏览器书签功能很强大

热门文章

  1. linux通过rpm和yum安装包
  2. P4888 三去矩阵
  3. 对Spring框架的理解(转)
  4. 《编写有效用例》阅读笔记04
  5. css中关于transform、transition、animate的区别
  6. BZOJ 2878: [Noi2012]迷失游乐园( 树形dp )
  7. 总结Cnblogs支持的常用Markdown语法
  8. [zoj3593]扩展欧几里得+三分
  9. Flutter入门进阶之旅(二)Hello Flutter
  10. Hyper-V 3.0网络虚拟化PART 3:内部交换机