博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UDP
阅读量:7221 次
发布时间:2019-06-29

本文共 4871 字,大约阅读时间需要 16 分钟。

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);        } }}

 

转载于:https://www.cnblogs.com/tianliang94/p/10320117.html

你可能感兴趣的文章
在 Windows 中安装 Laravel 5.1.X
查看>>
TeamViewer 9发布-在Linux下安装运行
查看>>
Centos7 Gitea安装教程 - 一款易搭建,运行快的Git服务器
查看>>
CentOS minimal 网络配置
查看>>
Nginx架构
查看>>
为什么结构体中的数组不能用const int变量指定大小?
查看>>
模板特化疑问
查看>>
ruby多线程理解
查看>>
享用甜点时要不要来杯咖啡?Java 与树莓派 (Raspberry PI)
查看>>
精通Oracle 10g Pl/SQL编程
查看>>
邱怡轩:R中大规模矩阵的SVD与矩阵补全
查看>>
C++ Primer习题集(第5版)
查看>>
centos7 mysql 5.7 yum安装
查看>>
JSOUP简单应用
查看>>
Mysql,SqlServer,Oracle主键自动增长的设置
查看>>
开源 java CMS - FreeCMS2.3会员登录
查看>>
malloc(0)的返回值
查看>>
析构方法、克隆对象
查看>>
Python字符编码详解
查看>>
Android开发 Firebase动态链接打开APP
查看>>