码迷,mamicode.com
首页 > 其他好文 > 详细

UDP的简单使用案例

时间:2015-05-12 13:06:16      阅读:119      评论:0      收藏:0      [点我收藏+]

标签:

 

UDP是User Datagram Protocol的简称,中文名是用户数据包协议,是OSI参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。在网络中它与TCP协议一样用于处理数据包。在OSI模型中,在第四层-传输层,处于IP协议的上一层。UDP有不提供数据报分组、组装和不能对数据包的排序的缺点,也就是说,当报文发送之后,是无法得知其是否安全完整到达的。UDP用来支持那些需要在计算机之间传输数据的网络应用。包括网络视频会议系统在内的众多的客户/服务器模式的网络应用都需要使用UDP协议。

与所熟知的TCP(Transmission control protocol传输控制协议)协议一样,UDP协议直接位于IP(网际协议)协议的顶层。根据OSI(开放系统互连)参考模型,UDP和TCP都属于传输层协议。

UDP协议的主要作用是将网络数据流量压缩成数据报的形式。一个典型的数据报就是一个二进制数据的传输单位。每一个数据报的前8个字节用来包含报头信息,剩余字节则用来包含具体的传输数据,传输数据大小不能超过64kb。

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打印出来的服务器端信息:

技术分享

 

UDP的简单使用案例

标签:

原文地址:http://www.cnblogs.com/denghaicheng/p/4496678.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!