UDP是User Datagram Protocol的简称, 中文名是用户数据报协议。是一种面向非链接通讯协议。java
其过程发送过程,与快递员送快递是相似的。假如快递员须要送一个件,他必须先把物件(文件)打包,而后让顾客填写寄件地址(ip地址),那么问题出现了。通常填写寄件地址是一个学校或者学院,假设该寄件地址上有A、B、C三人。那么快递员就必需要顾客填写收件人(假设A是收件人)的电话号码,打电话联系A,确保将物件送到A手上。所以电话号码就成了到达寄件地址后识别收件人的一个特征,通信协议称为端口。android
相应的代码建立步骤为;数组
1.生成DatagramSocket对象,参数为端口号;安全
DatagramSocket ds=new DatagramSocket(9999);app
2.建立一个InetAddress对象,用于肯定server客户端(数据接收方),参数为IP地址;socket
InetAddress serverAddress=InetAddress.getByName("192.168.31.52");ide
3.生成一个DatagramPacket对象,包含须要发送的byte数组,byte数组长度,已设置IPthis
地址的serverAddress,和服务端一致的端口号;
byte data[]=new byte[1024];spa
DatagramPacket dp = new DatagramPacket (data , data.length , serverAddress , 9999);.net
4.发送数据,调用DatagramSocket对象的send方法;
ds.send(dp);
其接受过程是,快递员已经到了寄件地址,而后电话联系A,确认后(即确认端口)后把快递给A。假设A拿着一个袋子取取快递,A就把快递放在包中,而后接收完毕。(备注,即便A没有袋子,那么也能够将A当作一个袋子,由于A也只能拿走力所能及的物品,超除外就只能放弃)。
1.建立一个DatagramSocket对象,并指定监听的端口号
DatagramSocket socket=;new DatagramSocket(6666)
2.建立一个byte数组(袋子)用于接收
byte data[]=new byte[1024];
3.建立一个空的DatagramPackage对象
DatagramPacket packet=new DatagramPacket(data,data.length);
4.使用receive方法接收发送方所发送的数据,同时这也是一个阻塞的方法
socket.receive(packet);
5.获得发送过来的数据
String str=new String(packet.getData(), packet.getOffset() ,packet.getLength());
UDP相对于TCP来讲,其安全性和可靠性是较弱的。由于该通讯方法依靠IP地址和端口号进行,没有反馈效果。
假设顾客的寄件地址(IP地址)或端口号填写错误了,则会发生丢包的状况;
假设收件人已经收到到快递,快递员没有反馈给顾客,那么顾客就会从新邮件一份过去。
故此编写UDP时须要在控制程序上编写反馈。UDP主要用于告诉传输和实时性要求较高的通讯和广播通讯上。
发送端的代码:
package com.example.udpdemo; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.InetAddress; import java.net.SocketException; import java.net.UnknownHostException; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.app.Activity; import android.util.Log; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; public class MainActivity extends Activity { DatagramSocket socket; //TextView receive_message; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //建立一个DatagramSocket对象 //建立一个 InetAddress , 至关因而地址 //这是随意发送一个数据 // Button bt=(Button)this.findViewById(R.id.bt); final EditText et = (EditText)this.findViewById(R.id.et); //建立监听器 bt.setOnClickListener(new OnClickListener(){ public void onClick(View v) { // TODO Auto-generated method stub new Thread(new Runnable(){ @Override public void run() { // TODO Auto-generated method stub Log.v("监听", "发送成功!"); String msg=et.getText().toString(); try { sendMsg(msg); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }).start(); } }); } protected void sendMsg(String msg) throws Exception{ //建立一个DatagramSocket对象 //建立一个 InetAddress , 至关因而地址 //这是随意发送一个数据 // //1.建立发送的套接字 DatagramSocket ds=new DatagramSocket(1234); //2.目标地址 InetAddress serverAddress=InetAddress.getByName("192.168.31.52"); //3.获取发送的数据 byte[] data=msg.getBytes(); DatagramPacket dp = new DatagramPacket (data , data.length , serverAddress , 9999); //发 ds.send(dp); Log.v("fasong", "发送成功!"); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }
接收端代码:
package udp; import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.SocketException; public class udpDemo { //1.建立一个DatagramSocket对象,并指定监听的端口号 //2.建立一个byte数组用于接收 //3. 建立一个空的DatagramPackage对象 //4. 使用receive方法接收发送方所发送的数据,同时这也是一个阻塞的方法 //5.获得发送过来的数据 public static void main(String [] args) throws Exception{ //建立了一个Socket DatagramSocket socket = new DatagramSocket(9999); while(true){ byte data[]=new byte[1024]; //建立一个空的datagramPackage DatagramPacket packet=new DatagramPacket(data,data.length); //接收发送方所发送的数据,同时这也是一种阻塞的方法 socket.receive(packet); String str=new String(packet.getData(), packet.getOffset() ,packet.getLength()); System.out.println("接收到的数据"+str); } }}