android的学习:UDP编程
一、代入
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编程相关推荐
- 菜鸟学习笔记:Java提升篇10(网络2——UDP编程、TCPSocket通信、聊天室案例)
菜鸟学习笔记:Java提升篇10(网络2--UDP编程.TCPSocket通信) UDP编程 TCP编程(Socket通信) 单个客户端的连接 多个客户端的连接(聊天室案例) UDP编程 在上一篇中讲 ...
- 【Android】手机安装Termux运行nodejs学习Javascript编程入门
Termux 是运行在Android手机上的一个 Linux 终端模拟器,干什么都要输入命令执行,不像 Windows 操作系统桌面用鼠标点点点,这里主要介绍用它来学习Javascript编程入门,当 ...
- Qt学习笔记之UDP编程
1. UDP概述 UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中 ...
- 【嵌入式Android开发学习攻略】手把手教你循序渐进的学习
[嵌入式Android开发学习攻略]手把手教你循序渐进的学习 学习嵌入式主要有以下几个方面: C语言:C是必须学的,它是最基础的 操作系统:Linux.Android 目前Linux是主流,这个一 ...
- Android画图学习总结(四)——Animation(中)
在Android画图学习总结(四)--Animation(上)中详细介绍了Tween Animation的定义.使用,由于篇幅有限,很多中重要的方面没有说明,这篇文章一方面做个完整的总结说明,另外一方 ...
- android java服务,Android进阶学习必会:Java Binder中的系统服务
前言 这个知识点是Android进阶学习必须掌握的知识点之一,也是高阶Android架构师经常问到的点.在这里分想给大家,希望对大家的工作和学习有所帮助.喜欢本文的记得点赞关注哦~ 在前面的Andro ...
- Android Studio --- [学习笔记]TCP(第2弹)、GridView、ScrollView
说明 这篇主要接上一篇Android Studio - > [学习笔记]RadioButton.CheckBox.ImageView.ListView.TCP的三次握手 对上面回答的细解,并用J ...
- Android Studio --- [学习笔记]RadioButton、CheckBox、ImageView、ListView、TCP的三次握手
说明 源代码 在2.x里有TCP的三次挥手与四次握手,先对它进行简单的回答(百度).预计在下一篇里,会继续说明TCP 接上一篇: Android Studio - > [学习笔记]Button. ...
- 将继续深入学习网络编程
一段时间了,已经可以熟练在Java使用Socket和nio编写服务器应用程序,对一些流行的nio应用框架也有了较深的了解,也自己做了一些实现,并且应用到实践中去. 我想,我需要从三个方面继续深入学习网 ...
- Android JNI学习(五)——Java与Native之间如何实现相互调用
本章将讲述Java与Native之间如何实现相互调用.我将围绕围绕如下三点来讲解. #mermaid-svg-qeVnGlVrLWrB5ryX .label{font-family:'trebuche ...
最新文章
- 机器学习研究与开发平台的选择
- Celery框架简单实例
- .NET6下周发布真的香,可不少人却只会.NET Framework!
- jsp+servlet+mysql实现的图书管理系统源码
- 华为ac控制器web配置手册_AC+AP组建无线网络,解决路由器没地方放,不美观
- 看我如何利用教科书级别的释放后使用漏洞(CVE-2020-6449)
- 程序人生:半路转行再来学软件测试,能够成为大牛吗?
- c++ 可变参数_深入剖析ProE可变扫描特征原理、操作和应用方法
- Flink 在 B 站的多元化探索与实践
- JavaScript 学习笔记一 (入门篇)
- 【Java编码规范】《阿里巴巴Java开发手册(正式版)》
- 如何做职业规划并进行求职准备(持续更新)
- 计算机辅助 高等数学教学,高等数学教学方法
- pythoneducoder苹果梨子煮水的功效_荸荠和梨子一起煮的好处
- 在windows生成SSH秘钥连接linux远程主机
- Linux下scons安装
- 华为智能汽车产业研究与投资机会分析
- 优信二手车与时俱进坚持创新
- 完美恢复Word文档,丢失、乱码和受损三大症状不再是难题
- 计算机操作系统——学习笔记(下)
热门文章
- nodejs+mysql网上书店图书销售购物商城系统vue
- php简单扑克游戏,完整版简易扑克牌游戏代码开发
- mysql8赋权_mysql 8.0给数据库添加用户和赋权
- 三字经带注解_《三字经》完整注释版
- 【论文写作】英文写作工具推荐及使用教程:DeepL(翻译) + EasyEssay(扩写) + QuillBot(改写润色)
- 来自window Presentation Foundation Program Design的读书笔记 第五篇下
- 配置分支机构与总部之间通过L2TP Over IPSec方式实现安全互通
- hp服务器330g6怎么安装系统,惠普(HP)246 G6 如何装win10系统
- Java 2实用教程(第三版)实验指导与习题解答and实验模版代码及答案 (二)
- 【来一杯word】微信小程序项目需求分析及设计初稿