博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android udp开发,Android UDP
阅读量:4318 次
发布时间:2019-06-06

本文共 3931 字,大约阅读时间需要 13 分钟。

一、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 UDPActivityextends Activity {

private Button bt_send_data =null;

DatagramSocket socket =null;

InetAddress serverAddress =null;

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() {

public void onClick(View arg0) {

new Thread(new Runnable() {

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

package="com.libill.demos"

android:versionCode="1"

android:versionName="1.0" >

android:minSdkVersion="8"

android:targetSdkVersion="10" />

android:allowBackup="true"

android:icon="@drawable/ic_launcher"

android:label="@string/app_name"

android:theme="@style/AppStartTheme" >

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

android:label="@string/app_name" >

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

afeb9c8d21d7c01a0994be9a38fcc442.png

参考博客:

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

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

你可能感兴趣的文章
Hive配置优化
查看>>
《C与指针》第十三章练习
查看>>
vue 各种 import 引入
查看>>
python基础学习笔记——Python基础教程(第2版 修订版)第18章)(程序打包)
查看>>
用CHTCollectionViewWaterfallLayout写瀑布流
查看>>
[翻译] JNWSpringAnimation
查看>>
spring-beanFactory三
查看>>
git 语句记录
查看>>
mysql的安装
查看>>
银行客户流失预测
查看>>
PDA手持扫描资产标签,盘点完成后将数据上传到PC端,固定资产系统查看盘点结果...
查看>>
[deviceone开发]-do_ImageView实现正圆的示例
查看>>
sql over(partition by) 开窗函数的使用
查看>>
100以内与7有关的数
查看>>
修改数据表中某字段的信息
查看>>
Mac下terminal中无法显示中文的问题
查看>>
1-库表查看及常用数据类型
查看>>
第六次java作业
查看>>
BNUOJ 4101(线性表的插入与删除)
查看>>
关于C++动态数组的若干问题
查看>>