Android UDP
一、UDP协议全称是用户数据报协议 ,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。
1、UDP是一个无连接协议,传输数据之前源端和终端不建立连接;
2、不维护连接状态,包括收发状态等,因此一台服务机可同时向多个客户机传输相同的消息;
3、UDP信息包的标题很短,8个字节,对于TCP的20个字节信息包的额外开销很小;
4、吞吐量不受拥挤控制算法的调节,只受应用软件生成数据的速率、传输带宽、源端和终端主机性能的限制;
5、不保证可靠交付;
6、UDP是面向报文的。
二、UDP的代码编程需要用到DatagramSocket类,Java使用DatagramSocket代表UDP协议的Socket,先了解一下如何使用这个类。
server服务端(接收数据方)创建步骤
1、生成DatagramSocket对象,参数为端口号
DatagramSocket socket = new DatagramSocket (8888);
2、byte数组用来接收数据
byte data[] = new byte[1024];
3、DatagramPackage以包形式装载byte数组
DatagramPacket packet = new DatagramPacket(data, data.length);
4、使用DatagramPacket的receive方法接收发送方所发送的数据,是一个阻塞的方法
socket.receive(packet);
5、接收到的数据转变化成可读字符串
String result = new String(packet.getData(), packet.getOffset(), packet.getLength());
client客户端(发送数据方)创建步骤
1、生成DatagramSocket对象,参数为端口号
DatagramSocket socket = new DatagramSocket (8888);
2、创建一个InetAddress对象,用于确定server客户端(数据接收方),参数为IP地址,如我的IP地址为192.168.1.103
InetAddress serverAddress = InetAddress.getByName("192.168.1.103");
3、需要发送的数据转化为byte数组
String sendData= "hello word";
byte data[] = sendData.getBytes();
4、生成一个DatagramPacket对象,包含需要发送的byte数组,byte数组长度,已设置IP地址的serverAddress,和服务端一致的端口号(这里是8888)
DatagramPacket packet = new DatagramPacket(data, data.length, serverAddress, 8888);
5、发送数据,调用DatagramSocket对象的send方法
socket.send(packet);
三、代码demo演示
server服务端,可以直接运行在eclipse即可
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地址。
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添加权限和注册
<?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 UDP的更多相关文章
- android udp 无法收到数据 (模拟器中)
解决方法:1. 运行模拟器2. 打开window 命令行执行:telnet localhost 55545554是模拟器的端口,执行之后会进入android console3. 在console下执行 ...
- Android udp json+数组 --->bytes发送数据
Android json支持五种数据类型 String / int(float)/bool / null / object 今天说 object : json = new JSONObject( ...
- 【原创】NIO框架入门(四):Android与MINA2、Netty4的跨平台UDP双向通信实战
概述 本文演示的是一个Android客户端程序,通过UDP协议与两个典型的NIO框架服务端,实现跨平台双向通信的完整Demo. 当前由于NIO框架的流行,使得开发大并发.高性能的互联网服务端成为可能. ...
- [书目20160624]Android应用开发从入门到精通
卢海东 著 第1章 揭开神秘面纱——Android系统简介 1 1.1 认识Android系统 2 1.1.1 Android成长历程 2 1.1.2 发行版本 3 1.1.3 得到大 ...
- android firmware 利用UDP socket发送Magic Packet--python版本
android firmware 利用UDP socket发送Magic Packet--python版本 #!/usr/bin/python import sys, time from struct ...
- android firmware 利用UDP socket发送Magic Packet--c语言版本
android firmware 利用UDP socket发送Magic Packet 1 Magic Packet格式: 6个0xFF + 16个Dst Mac Address 2 代码需要设置目的 ...
- Android杂谈--HTC等手机接收不到UDP广播报文的解决方案
最近遇到个问题,在android手机上发送UDP报文的时候,HTC等机型(测试用HTC new one)接收不到广播报文,而其他的samsung, huawei, xiaomi, nexus等等均没有 ...
- Android视频直播解决方案(rstp、udp)
做局域网视频直播有两种方案,通过rstp或udp协议. 1.rstp协议,网络上有个开源项目,基于Android,且这个项目也是一个服务端,里面也集成了http访问页面,可以通过http或者rstp直 ...
- Socket 通信原理(Android客户端和服务器以TCP&&UDP方式互通)
转载地址:http://blog.csdn.net/mad1989/article/details/9147661 ZERO.前言 有关通信原理内容是在网上或百科整理得到,代码部分为本人所写,如果不当 ...
随机推荐
- html5摇一摇[转]
写在前面 年底了,有些公司会出一个摇奖的活动,今天在家没事就搜了一下这方面的资料. 原文地址:http://www.cnblogs.com/waitingbar/p/4682215.html 测试 效 ...
- 未能正确加载“Microsoft.VisualStudio.Editor.Implementation.EditorPackage,
未能正确加载“Microsoft.VisualStudio.Editor.Implementation.EditorPackage, Microsoft.VisualStudio.Editor.Imp ...
- PHP 500 -Invalid command RewriteEngine的解决
转自:http://blog.csdn.net/wang02011/article/details/8205903 环境: wampserver-2.1a 系统 : win8 错误 : 500 ...
- ASP.NET MVC学习笔记-----使用自定义的View Engine
我们都知道在ASP.NET MVC中自带了Razor View Engine,Razor十分的强大,可以满足我们绝大部分的需要.但是ASP.NET MVC的高度可扩展性,使我们可以使用自定义的View ...
- web安全防范
xss漏洞 原理:信任了用户输入或控制的字段(url),回显(jQuery.html)到页面.导致script代码执行 后果:可以在页面执行任何hack代码,比如死循环.发送cookie.钓鱼.页面显 ...
- IE7 -- 鼠标移入显示下拉框 不显示的问题 / 以及宽度问题
这个问题,真的是打击到我了,我一度不相信自己无法解决这个问题.但是我就是真的没有解决. 那么问题解决方案是: 第一 祖先级别有一个相对定位,父级再有一个定位,那么绝对定位显示出来的元素就会不显示. 第 ...
- Sqlserver日期函数应用
1.获取当前时间 SELECT GETDATE() AS '当前日期' , DATENAME(year, GETDATE()) AS '年' , DATENAME(m ...
- MYSQL主从数据库搭建
sc delete "服务名" 删除服务 环境: (以下是我这次搭建所使用的环境) 主数据库: 系统:ubuntu : MYSQL 5.1.63 :ip:192.1 ...
- ethtool 命令详解
命令描述: ethtool 是用于查询及设置网卡参数的命令. 使用概要:ethtool ethx //查询ethx网口基本设置,其中 x 是对应网卡的编号,如eth0.eth1等等 转自: ...
- 《ASP.NET1200例》各种类型文件汇总
aspx是页面文件 ascx是用户控件,用户控件必须嵌入到aspx中才能使用. ascx是用户控件,相当于模板 其实ascx你可以理解为Html里的一部分代码, 只是嵌到aspx里而已, 因为aspx ...