Android网络编程之UDP通信模型实例
什么是android udp?
udp是user datagram protocol的简称,中文名是用户数据包协议,是osi参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。它是ietf rfc 768是udp的正式规范。在网络中它与tcp协议一样用于处理数据包。在osi模型中,在第四层-传输层,处于ip协议的上一层。udp有不提供数据报分组、组装和不能对数据包的排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。udp用来支持那些需要在计算机之间传输数据的网络应用。包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都需要使用udp协议。udp协议从问世至今已经被使用了很多年,虽然其最初的光彩已经被一些类似协议所掩盖,但是即使是在今天,udp仍然不失为一项非常实用和可行的网络传输层协议。
与所熟知的tcp(传输控制协议)协议一样,udp协议直接位于ip(网际协议)协议的顶层。根据osi(开放系统互连)参考模型,udp和tcp都属于传输层协议。
udp协议的主要作用是将网络数据流量压缩成数据报的形式。一个典型的数据报就是一个二进制数据的传输单位。每一个数据报的前8个字节用来包含报头信息,剩余字节则用来包含具体的传输数据。
tcp和udp在android中的使用和在java里是完全一样的。
服务端:
package com.cheerchip.core;
import java.io.ioexception;
import java.net.datagrampacket;
import java.net.datagramsocket;
import java.net.socketexception;
import android.util.log;
public class udpserver implements runnable {
private static final int port = 6000;
private byte[] msg = new byte[1024];
private boolean life = true;
public udpserver() {
}
/**
* @return the life
*/
public boolean islife() {
return life;
}
/**
* @param life
* the life to set
*/
public void setlife(boolean life) {
this.life = life;
}
@override
public void run() {
datagramsocket dsocket = null;
datagrampacket dpacket = new datagrampacket(msg, msg.length);
try {
dsocket = new datagramsocket(port);
while (life) {
try {
dsocket.receive(dpacket);
log.i("msg sever received", new string(dpacket.getdata()));
} catch (ioexception e) {
e.printstacktrace();
}
}
} catch (socketexception e) {
e.printstacktrace();
}
}
}
客户端:
package com.cheerchip.core;
import java.io.ioexception;
import java.net.datagrampacket;
import java.net.datagramsocket;
import java.net.inetaddress;
import java.net.socketexception;
import java.net.unknownhostexception;
public class udpclient {
private static final int server_port = 6000;
private datagramsocket dsocket = null;
private string msg;
/**
* @param msg
*/
public udpclient(string msg) {
super();
this.msg = msg;
}
/**
* 发送信息到服务器
*/
public string send() {
stringbuilder sb = new stringbuilder();
inetaddress local = null;
try {
local = inetaddress.getbyname("localhost"); // 本机测试
sb.append("已找到服务器,连接中...").append("/n");
} catch (unknownhostexception e) {
sb.append("未找到服务器.").append("/n");
e.printstacktrace();
}
try {
dsocket = new datagramsocket(); // 注意此处要先在配置文件里设置权限,否则会抛权限不足的异常
sb.append("正在连接服务器...").append("/n");
} catch (socketexception e) {
e.printstacktrace();
sb.append("服务器连接失败.").append("/n");
}
int msg_len = msg == null ? 0 : msg.length();
datagrampacket dpacket = new datagrampacket(msg.getbytes(), msg_len,
local, server_port);
try {
dsocket.send(dpacket);
sb.append("消息发送成功!").append("/n");
} catch (ioexception e) {
e.printstacktrace();
sb.append("消息发送失败.").append("/n");
}
dsocket.close();
return sb.tostring();
}
}
主activity:
public class mainact extends activity {
edittext msg_et = null;
button send_bt = null;
textview info_tv = null;
@override
public void oncreate(bundle savedinstancestate) {
super.oncreate(savedinstancestate);
setcontentview(r.layout.main);
msg_et = (edittext) findviewbyid(r.id.msg_et);
send_bt = (button) findviewbyid(r.id.send_bt);
info_tv = (textview) findviewbyid(r.id.info_tv);
// 开启服务器
executorservice exec = executors.newcachedthreadpool();
udpserver server = new udpserver();
exec.execute(server);
// 发送消息
send_bt.setonclicklistener(new onclicklistener() {
@override
public void onclick(view v) {
udpclient client = new udpclient(msg_et.gettext().tostring());
info_tv.settext(client.send());
}
});
}
}
注意在配置文件中要加上:
以获取相应的权限。
效果图:
logcat打印出来的服务器端信息:
上一篇: 两款手游版号被撤销 游戏版号管理愈加严格