UDP

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值