A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© sheng6699 中级黑马   /  2014-4-27 21:46  /  605 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马