您的位置:首页 > 移动开发 > Android开发

android 简易UDP通信模型

2013-03-25 10:36 471 查看
什么是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里是完全一样的。

服务端:

[java] view
plaincopyprint?

package com.cheerchip.core;

import java.io.IOException;

import java.net.DatagramPacket;

import java.net.DatagramSocket;

import java.net.SocketException;

import android.util.Log;

/**

* @author jerry.lingchao.wensefu

* date: 2010-12-21

* android网络编程 UDP服务器类

*/

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

}

}

}

客户端:

[java] view
plaincopyprint?

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;

/**

* @author jerry.lingchao.wensefu date: 2010-12-21 android网络编程 UDP客户端类

*/

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:

[java] view
plaincopyprint?

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

}

});

}

}

注意在配置文件中要加上<uses-permission android:name="android.permission.INTERNET" />

以获取相应的权限

效果图:



LogCat打印出来的服务器端信息:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: