UDP是User Datagram Protocol的简称, 中文名是用户数据报协议。是一种面向非连接通信协议。
其过程发送过程,与快递员送快递是类似的。假如快递员需要送一个件,他必须先把物件(文件)打包,然后让顾客填写寄件地址(ip地址),那么问题出现了。一般填写寄件地址是一个学校或者学院,假设该寄件地址上有A、B、C三人。那么快递员就必须要顾客填写收件人(假设A是收件人)的电话号码,打电话联系A,确保将物件送到A手上。因此电话号码就成了到达寄件地址后识别收件人的一个特征,通讯协议称为端口。
相应的代码创建步骤为;
1.生成DatagramSocket对象,参数为端口号;
DatagramSocket ds=new DatagramSocket(9999);
2.创建一个InetAddress对象,用于确定server客户端(数据接收方),参数为IP地址;
InetAddress serverAddress=InetAddress.getByName("192.168.31.52");
3.生成一个DatagramPacket对象,包含需要发送的byte数组,byte数组长度,已设置IP
地址的serverAddress,和服务端一致的端口号;
byte data[]=new byte[1024];DatagramPacket dp = new DatagramPacket (data , data.length , serverAddress , 9999);
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); } }}