什么是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里是完全一样的。

 

服务端:

  1. package com.cheerchip.core;  
  2.   
  3. import java.io.IOException;  
  4. import java.net.DatagramPacket;  
  5. import java.net.DatagramSocket;  
  6. import java.net.SocketException;  
  7.   
  8. import android.util.Log;  
  9.   
  10. /** 
  11.  * @author jerry.lingchao.wensefu  
  12.  * date: 2010-12-21  
  13.  * android网络编程 UDP服务器类 
  14.  */  
  15. public class UDPServer implements Runnable {  
  16.   
  17.     private static final int PORT = 6000;  
  18.   
  19.     private byte[] msg = new byte[1024];  
  20.   
  21.     private boolean life = true;  
  22.   
  23.     public UDPServer() {  
  24.     }  
  25.   
  26.     /** 
  27.      * @return the life 
  28.      */  
  29.     public boolean isLife() {  
  30.         return life;  
  31.     }  
  32.   
  33.     /** 
  34.      * @param life 
  35.      *            the life to set 
  36.      */  
  37.     public void setLife(boolean life) {  
  38.         this.life = life;  
  39.     }  
  40.   
  41.     @Override  
  42.     public void run() {  
  43.         DatagramSocket dSocket = null;  
  44.         DatagramPacket dPacket = new DatagramPacket(msg, msg.length);  
  45.         try {  
  46.             dSocket = new DatagramSocket(PORT);  
  47.             while (life) {  
  48.                 try {  
  49.                     dSocket.receive(dPacket);  
  50.                     Log.i("msg sever received"new String(dPacket.getData()));  
  51.                 } catch (IOException e) {  
  52.                     e.printStackTrace();  
  53.                 }  
  54.             }  
  55.         } catch (SocketException e) {  
  56.             e.printStackTrace();  
  57.         }  
  58.     }  
  59. }  

 

 

客户端:

 

 

  1. package com.cheerchip.core;  
  2.   
  3. import java.io.IOException;  
  4. import java.net.DatagramPacket;  
  5. import java.net.DatagramSocket;  
  6. import java.net.InetAddress;  
  7. import java.net.SocketException;  
  8. import java.net.UnknownHostException;  
  9.   
  10. /** 
  11.  * @author jerry.lingchao.wensefu date: 2010-12-21 android网络编程 UDP客户端类 
  12.  */  
  13. public class UDPClient {  
  14.   
  15.     private static final int SERVER_PORT = 6000;  
  16.   
  17.     private DatagramSocket dSocket = null;  
  18.   
  19.     private String msg;  
  20.   
  21.     /** 
  22.      * @param msg 
  23.      */  
  24.     public UDPClient(String msg) {  
  25.         super();  
  26.         this.msg = msg;  
  27.     }  
  28.   
  29.     /** 
  30.      * 发送信息到服务器 
  31.      */  
  32.     public String  send(){  
  33.         StringBuilder sb=new StringBuilder();  
  34.         InetAddress local = null;  
  35.         try {  
  36.             local = InetAddress.getByName("localhost"); // 本机测试   
  37.             sb.append("已找到服务器,连接中...").append("/n");  
  38.         } catch (UnknownHostException e) {  
  39.             sb.append("未找到服务器.").append("/n");  
  40.             e.printStackTrace();  
  41.         }  
  42.         try {  
  43.             dSocket = new DatagramSocket(); // 注意此处要先在配置文件里设置权限,否则会抛权限不足的异常   
  44.             sb.append("正在连接服务器...").append("/n");  
  45.         } catch (SocketException e) {  
  46.             e.printStackTrace();  
  47.             sb.append("服务器连接失败.").append("/n");  
  48.         }  
  49.         int msg_len = msg == null ? 0 : msg.length();  
  50.         DatagramPacket dPacket = new DatagramPacket(msg.getBytes(), msg_len,  
  51.                 local, SERVER_PORT);  
  52.         try {  
  53.             dSocket.send(dPacket);  
  54.             sb.append("消息发送成功!").append("/n");  
  55.         } catch (IOException e) {  
  56.             e.printStackTrace();  
  57.             sb.append("消息发送失败.").append("/n");  
  58.         }  
  59.         dSocket.close();  
  60.         return sb.toString();  
  61.     }  
  62.   
  63. }  

 

 

主Activity:

  1. public class MainAct extends Activity {  
  2.   
  3.     EditText msg_et=null;  
  4.     Button send_bt=null;  
  5.     TextView info_tv=null;  
  6.       
  7.     @Override  
  8.     public void onCreate(Bundle savedInstanceState) {  
  9.         super.onCreate(savedInstanceState);  
  10.         setContentView(R.layout.main);  
  11.           
  12.         msg_et=(EditText)findViewById(R.id.msg_et);  
  13.         send_bt=(Button)findViewById(R.id.send_bt);  
  14.         info_tv=(TextView)findViewById(R.id.info_tv);  
  15.           
  16.         //开启服务器   
  17.         ExecutorService exec=Executors.newCachedThreadPool();  
  18.         UDPServer server=new UDPServer();  
  19.         exec.execute(server);  
  20.           
  21.         //发送消息   
  22.         send_bt.setOnClickListener(new OnClickListener() {  
  23.             @Override  
  24.             public void onClick(View v) {  
  25.                 UDPClient client=new UDPClient(msg_et.getText().toString());  
  26.                 info_tv.setText(client.send());  
  27.             }  
  28.         });  
  29.     }  
  30. }  

 

 

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

以获取相应的权限

 

效果图:

 

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

 

posted on 2012-08-03 12:48  奋青  阅读(884)  评论(0编辑  收藏  举报