Android UDP

Android UDP,第1张

概述一、UDP协议全称是用户数据报协议 ,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。1、UDP是一个无连接协议,传输数据之前源端和终端不建立连接;2、不维护连接状态,包括收发状态等,因

一、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所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1119265.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-29
下一篇2022-05-29

发表评论

登录后才能评论

评论列表(0条)

    保存