一、代入

UDP是User Datagram Protocol的简称,是一种无连接的协议,每个数据报都是一个独立的信息,包括完整的源地址或目的地址,它在网络上以任何可能的路径传往目的地,因此能否到达目的地,到达目的地的时间以及内容的正确性都是不能被保证的

二、UDP协议的特点

  • 每个数据报中都给出了完整的地址信息,因此无需要建立发送方和接收方的连接。
  • UDP传输数据时是有大小的限制的,每个被传输的数据报必须限定在64KB之内。
  • UDP是一个不可靠的协议,发送方所发送的数据报并不一定以相同的次序到达接收方。
  • 日常应用:远程连接、文件传输、视频会议等

三、DatagramSocket

DatagramSocket本身只是码头,不维护状态,不能产生IO流,其唯一的功能是接收和发送数据报。Java语言使用DatagramPacket代表数据报,DatagramSocket的接收和发送数据功能都是通过DatagramPacket对象实现的。
在DatagramSocket中有3个构造器:

  • DatagramSocket() : 负责创建一个DatagramSocket实例,并将对象绑定到本机默认IP地址,本机所有可用端口中随机选择的某个端口

  • DatagramSocket( int port ) : 负责创建一个DatagramSocket实例,并将对象绑定到本机默认IP地址、指定端口号。

  • DatagramSocket( int port, InetAddress laddr ) : 负责创建一个DatagramSocket实例,并将该对象绑定到指定IP地址、指定端口。

    在java程序中,通过上述任意一个构造器即可创建一个DatagramSocket实例。在创建服务器时必须创建指定端口的DatagramSocket实例,目的是保证其他客户端可以将数据发送到该服务器。一旦得到了DatagramSocket实例,可以通过下面两个方法接收和发送数据报:

  • Receive( DatagramPacket p ) : 从该DatagramSocket中接收数据报。

  • Send( DatagramPacket p ) ; 以该DatagramSocket对象向外发送数据报。

    在使用DatagramPacket发送数据报时,DatagramSocket并不知道将该数据报发送到哪里,而是由DatagramPacket自身决定数据数据报的目的。就像码头并不知道每个集装箱的目的地,码头只是将这些集装箱发送出去,而集装箱本身包含了该集装箱的目的地。

    当Client/Server程序中使用UDP协议,实际上并没有明显的服务器和客户端,因为两方都需要先建立一个DatagramSocket对象,用来接收或发送数据报,然后使用DatagramPacket对象作为传输数据的载体。通常固定IP、固定端口的DatagramSocket对象所在的程序被成为服务器,因为该DatagramSocket可以主动接收客户端数据。

四、DatagramPacket

DatagramPacket :用于处理宝文,将byte数组、目标地址、目标端口等数据包装成报文将报文拆卸成byte数组。

  • DatagramPacket( byte [ ] buf , int length ) : 以一个空数组来创建DatagramPacket对象,该对象的作用是接收DatagramSocket中的数据。

  • DatagramPacket( byte [ ] buf , int length ,InetAddress addr ,int port ) : 以一个包含数据的数组来创建DatagramPacket对象,创建该DatagramPacktet时还指定了一个IP地址和端口。这就决定看该数据报的目的。

  • DatagramPacket( byte [ ] buf , int offet , int length ): 以一个空数组来创建DatagramPacket对象,并指定接收到的数据放入buf数组中从offet开始,最多放length个字节。

  • DatagramPacket( byte [ ] buf ,int offet , int length , InetAddress adrress ,int port): 创建一个用于发送的DatagramPacket对象,也多指定了一个offset参数。

    在接收数据前,应该采用上面的第一个或第三个构造器生成一个DatagramPacket对象,给出接收数据的字节数组及其长度。然后调用DatagramSocket中的receive()方法等待数据报的到来,此方法将一直等待(也就是说会阻塞调用该方法的线程),直到收到一个数据报为止。例如下面的代码 :

    //创建接收数据的DatagramPacket对象
    DatagranPacket packet = new DatagramPacket( buf ,256);
    //接收数据
    socket.receive( packet );
    

    在发送数据之前,调用第二个或第四个构造器创建DatagramPacket对象,此时的字节数组里存放了想发送的数据。除此之外,还要给出完整的目的地址,包括IP地址和端口号。发送数据是通过DatagramSocket的方法send()实现的,方法send()根据数据报的目的地址来寻径以传递数据报。例如下面的代码 :

    //创建一个发送数据的DatagramPacket对象
    DatagramPacket packet = new DatagramPacket( buf , length,address , port );
    //发送数据报
    socket.send(packer);
    

    接着DatagramPacket为我们提供了方法getData() , 此方法可以返回DatagramPacket对象中封装的字节数组。
    当服务器(也可以客户端)接收到一个DatagramPacket对象后,如果想向该数据报的发送者“反馈”一些信息,但由于UDP是面向非连接的,所以接受者并不知道每个数据报由谁发送过来,但程序可以调用DatagramPacket的如下3个方法来获取发送者的IP和端口信息。

  • InetAddress getAddress() : 返回某台机器的IP地址,当程序准备发送此数据时,该方法返回数据报的发送主机的IP地址。

  • int getPort( ) : 返回某台机器的端口,当程序准备发送此数据报时,该方法返回此数据报的目标机器的端口,该方法返回数据报是源SocketAddress.

  • SocketAddress getSocketAddress( ) : 返回完整SocketAddress,通常由IP地址和端口号组成。当程序准备发送此数据报时,该方法返回此数据报的目标SocketAddress;当程序刚刚接收到一个数据报时,该方法返回该数据报是源SocketAddress.

    上述SocketAddress方法的返回值是一个SocketAddress对象,该对象实际上就是一个IP地址和一个端口号,也就是说SocketAddress对象封装了一个InetAddress对象和一个代表端口的整数,所以使用SocketAddress对象可以同时代表IP地址和端口。

五、实例

UDPServer.java 服务器端

public class UDPServer {public static void main(String []args){try {//1、创建服务器端,指定端口号DatagramSocket socket = new DatagramSocket(9809);//2、创建一个数据报,用来接收客户端发送的数据byte[] data = new byte[1024];DatagramPacket packet = new DatagramPacket(data,data.length);System.out.println("***我是服务器端,等待客户端的请求***");socket.receive(packet);//此时服务器处于阻塞状态,等待客户端的请求//3、读取数据String info = new String(data,0,packet.getLength());System.out.println("我是服务器端,客户端说"+info);//向客户端发送数据InetAddress address = packet.getAddress();int port = packet.getPort();byte[] data2 = "欢迎您!".getBytes();//2、创建数据报,包含响应的数据信息DatagramPacket packet1 = new DatagramPacket(data2,data2.length,address,port);socket.send(packet1);socket.close();} catch (SocketException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
}

UDPClient.java 客户端

public class UDPClient {public static void main(String [] args){try {//1、定义服务器端的地址、端口号、数据InetAddress address = InetAddress.getByName("localhost");int port = 9809;byte[] data = "用户名:***;密码:12345".getBytes();//将字符型常量转换成字节型数组//2、创建要发送的数据报DatagramPacket packet = new DatagramPacket(data,data.length,address,port);//3、向服务器发送数据DatagramSocket socket = new DatagramSocket();socket.send(packet);//接收服务器的数据byte[] data1 = new byte[1024];DatagramPacket packet1 = new DatagramPacket(data1,data1.length);socket.receive(packet1);String reply = new String(data1,0,packet1.getLength());System.out.println("我是客户端,服务器端说:"+reply);} catch (UnknownHostException | SocketException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
}

运行结果

参考书籍

《精通Android网络开发》—王东华*编著

android的学习:UDP编程相关推荐

  1. 菜鸟学习笔记:Java提升篇10(网络2——UDP编程、TCPSocket通信、聊天室案例)

    菜鸟学习笔记:Java提升篇10(网络2--UDP编程.TCPSocket通信) UDP编程 TCP编程(Socket通信) 单个客户端的连接 多个客户端的连接(聊天室案例) UDP编程 在上一篇中讲 ...

  2. 【Android】手机安装Termux运行nodejs学习Javascript编程入门

    Termux 是运行在Android手机上的一个 Linux 终端模拟器,干什么都要输入命令执行,不像 Windows 操作系统桌面用鼠标点点点,这里主要介绍用它来学习Javascript编程入门,当 ...

  3. Qt学习笔记之UDP编程

    1. UDP概述 UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中 ...

  4. 【嵌入式Android开发学习攻略】手把手教你循序渐进的学习

    [嵌入式Android开发学习攻略]手把手教你循序渐进的学习 学习嵌入式主要有以下几个方面: C语言:C是必须学的,它是最基础的 操作系统:Linux.Android   目前Linux是主流,这个一 ...

  5. Android画图学习总结(四)——Animation(中)

    在Android画图学习总结(四)--Animation(上)中详细介绍了Tween Animation的定义.使用,由于篇幅有限,很多中重要的方面没有说明,这篇文章一方面做个完整的总结说明,另外一方 ...

  6. android java服务,Android进阶学习必会:Java Binder中的系统服务

    前言 这个知识点是Android进阶学习必须掌握的知识点之一,也是高阶Android架构师经常问到的点.在这里分想给大家,希望对大家的工作和学习有所帮助.喜欢本文的记得点赞关注哦~ 在前面的Andro ...

  7. Android Studio --- [学习笔记]TCP(第2弹)、GridView、ScrollView

    说明 这篇主要接上一篇Android Studio - > [学习笔记]RadioButton.CheckBox.ImageView.ListView.TCP的三次握手 对上面回答的细解,并用J ...

  8. Android Studio --- [学习笔记]RadioButton、CheckBox、ImageView、ListView、TCP的三次握手

    说明 源代码 在2.x里有TCP的三次挥手与四次握手,先对它进行简单的回答(百度).预计在下一篇里,会继续说明TCP 接上一篇: Android Studio - > [学习笔记]Button. ...

  9. 将继续深入学习网络编程

    一段时间了,已经可以熟练在Java使用Socket和nio编写服务器应用程序,对一些流行的nio应用框架也有了较深的了解,也自己做了一些实现,并且应用到实践中去. 我想,我需要从三个方面继续深入学习网 ...

  10. Android JNI学习(五)——Java与Native之间如何实现相互调用

    本章将讲述Java与Native之间如何实现相互调用.我将围绕围绕如下三点来讲解. #mermaid-svg-qeVnGlVrLWrB5ryX .label{font-family:'trebuche ...

最新文章

  1. 机器学习研究与开发平台的选择
  2. Celery框架简单实例
  3. .NET6下周发布真的香,可不少人却只会.NET Framework!
  4. jsp+servlet+mysql实现的图书管理系统源码
  5. 华为ac控制器web配置手册_AC+AP组建无线网络,解决路由器没地方放,不美观
  6. 看我如何利用教科书级别的释放后使用漏洞(CVE-2020-6449)
  7. 程序人生:半路转行再来学软件测试,能够成为大牛吗?
  8. c++ 可变参数_深入剖析ProE可变扫描特征原理、操作和应用方法
  9. Flink 在 B 站的多元化探索与实践
  10. JavaScript 学习笔记一 (入门篇)
  11. 【Java编码规范】《阿里巴巴Java开发手册(正式版)》
  12. 如何做职业规划并进行求职准备(持续更新)
  13. 计算机辅助 高等数学教学,高等数学教学方法
  14. pythoneducoder苹果梨子煮水的功效_荸荠和梨子一起煮的好处
  15. 在windows生成SSH秘钥连接linux远程主机
  16. Linux下scons安装
  17. 华为智能汽车产业研究与投资机会分析
  18. 优信二手车与时俱进坚持创新
  19. 完美恢复Word文档,丢失、乱码和受损三大症状不再是难题
  20. 计算机操作系统——学习笔记(下)

热门文章

  1. nodejs+mysql网上书店图书销售购物商城系统vue
  2. php简单扑克游戏,完整版简易扑克牌游戏代码开发
  3. mysql8赋权_mysql 8.0给数据库添加用户和赋权
  4. 三字经带注解_《三字经》完整注释版
  5. 【论文写作】英文写作工具推荐及使用教程:DeepL(翻译) + EasyEssay(扩写) + QuillBot(改写润色)
  6. 来自window Presentation Foundation Program Design的读书笔记 第五篇下
  7. 配置分支机构与总部之间通过L2TP Over IPSec方式实现安全互通
  8. hp服务器330g6怎么安装系统,惠普(HP)246 G6 如何装win10系统
  9. Java 2实用教程(第三版)实验指导与习题解答and实验模版代码及答案 (二)
  10. 【来一杯word】微信小程序项目需求分析及设计初稿