Android UDP

编程之家收集整理的这篇文章主要介绍了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.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,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群
编程之家官方3群
编程之家官方4群

相关文章

猜你在找的Android相关文章

第一部分 个性化控件(View)主要介绍那些不错个性化的 View,包括 ListView、ActionBar、Menu、ViewPager、Gallery、GridView、ImageView、ProgressBar、TextView、ScrollView、TimeView、TipView、FlipView、ColorPickView、GraphView、UI Style 等等。一、Li...
View与Widget带小红点的提示:BadgeViewBadgeView(stefanjauker的,改颜色需要在BadgeView源码里面改) android-viewbadger(可以设置提示为数字或者文字,以及背景颜色)标签tagviewTAGView(可以设置背景图片的形状和颜色,可以同时显示图片和文字) android-tagview(Android-Cloud-Ta...
内容抽屉菜单 ListView WebView SwitchButton 按钮 点赞按钮 进度条 TabLayout 图标 下拉刷新 ViewPager 图表(Chart) 菜单(Menu) 浮动菜单 对话框 空白页 滑动删除 手势操作 RecyclerView Card Color Drawable Spinner 布局 模糊效果 TabBar AppBar 选择器(Picker) 跑马灯 日历时间 主题样式 ImageView 通知
Android Context作用Context 用于访问全局信息的接口App的资源: strings, drawable资源等等下面咱们来看一个例子public class MainActivity extends Activity { String TAG = "CARLOZ"; @Override protected void onCreate(Bundle savedIn
broadcast, aidl和Content Provider的区别和适用场所这3种都可以实现跨进程的通信,那么从效率,适用范围,安全性等方面来比较的话他们3者之间有什么区别?最好举个例子的。broadcast:用于发送和接收广播!实现信息的发送和接收! aidl:用于不同程序将服务的相互调用!实现了一个程序为另一个程序服务的功能! Content Provider:用于将程序的数据库人为地
net与wap什么意思WAP上网所谓WAP(Wireless Application Protocol)即无线应用协议,是一项全球性的网络通信协议。WAP使移动Internet 有了一个通行的标准,其目标是将Internet的丰富信息及先进的业务引入到移动电话等无线终端之中。WAP定义可通用的平台,把目前Internet网上HTML语言的信息转换成用WML(Wireless Markup Langu
直接上图:
在项目中加了个Jar包 运行时 没事 打包时,在用到Jar中类的地方会崩溃加入到项目中的jar包只要project.properties文件中加了这么一句:proguard.config=proguard.cfg那么proguard.cfg 混淆文件就会起作用,在打包成APK时对项目进行混淆但是当我们加入jar包时,混淆后有些方法在虚拟机中运行会找不到要对每一个加入的ja...
微信公众号搜索 “ 程序精选 ” ,选择关注!
微信公众号搜 "程序精选"关注