Android(java)学习笔记80:UDP协议发送数据

UDP协议发送数据:我们总是先运行接收端,再运行发送端发送端: 1 package cn.itcast_02;
 2
 3 import java.io.IOException;
 4 import java.net.DatagramPacket;
 5 import java.net.DatagramSocket;
 6 import java.net.InetAddress;
 7 /*
 8  * UDP协议发送数据:
 9  * A:创建发送端Socket对象
10  * B:创建数据,并把数据打包
11  * C:调用Socket对象的发送方法发送数据包
12  * D:释放资源
13  */
14 public class SendDemo {
15     public static void main(String[] args) throws IOException {
16         // 创建发送端Socket对象
17         // DatagramSocket()
18         DatagramSocket ds = new DatagramSocket();
19
20         // 创建数据,并把数据打包
21         // DatagramPacket(byte[] buf, int length, InetAddress address, int port)
22         // 创建数据
23         byte[] bys = "hello,udp,我来了".getBytes();//转码
24         // 长度
25         int length = bys.length;
26         // IP地址对象
27         InetAddress address = InetAddress.getByName("192.168.12.92");
28         // 端口
29         int port = 10086;
30         DatagramPacket dp = new DatagramPacket(bys, length, address, port);
31
32         // 调用Socket对象的发送方法发送数据包
33         // public void send(DatagramPacket p)
34         ds.send(dp);
35
36         // 释放资源
37         ds.close();
38     }
39 }
 接收端: 1 package cn.itcast_02;
 2
 3 import java.io.IOException;
 4 import java.net.DatagramPacket;
 5 import java.net.DatagramSocket;
 6 import java.net.InetAddress;
 7
 8 /*
 9  * UDP协议接收数据:
10  * A:创建接收端Socket对象
11  * B:创建一个数据包(接收容器)
12  * C:调用Socket对象的接收方法接收数据
13  * D:解析数据包,并显示在控制台
14  * E:释放资源
15  */
16 public class ReceiveDemo {
17     public static void main(String[] args) throws IOException {
18         // 创建接收端Socket对象
19         // DatagramSocket(int port)
20         DatagramSocket ds = new DatagramSocket(10086);
21
22         // 创建一个数据包(接收容器)
23         // DatagramPacket(byte[] buf, int length)
24         byte[] bys = new byte[1024];
25         int length = bys.length;
26         DatagramPacket dp = new DatagramPacket(bys, length);
27
28         // 调用Socket对象的接收方法接收数据
29         // public void receive(DatagramPacket p)
30         ds.receive(dp); // 阻塞式
31
32         // 解析数据包,并显示在控制台
33         // 获取对方的ip
34         // public InetAddress getAddress()
35         InetAddress address = dp.getAddress();
36         String ip = address.getHostAddress();
37         // public byte[] getData():获取数据缓冲区
38         // public int getLength():获取数据的实际长度
39         byte[] bys2 = dp.getData();
40         int len = dp.getLength();
41         String s = new String(bys2, 0, len);
42         System.out.println(ip + "传递的数据是:" + s);
43
44         // 释放资源
45         ds.close();
46     }
47 }

这里ds.close():

java的内存回收机制,也是要等到资源达到一定限度才开始回收,也是有生命周期的。用close()可以及时回收资源,更加高效.使用close()后就可以及时释放资源,不必非等到最后资源占用完了才开始痛苦的回收过程,而且从良好的编程习惯来说,创建了对象,就应该考虑到用完后就要释放内存资源,要养成一个良好的编程习惯。

这里首先我们是运行接收端,因为如果不先运行接收端,先运行发送端的话,数据也不会接收到。但是与此同时,如果先运行接收端,可是没有接收到数据,不可能解析数据和显示数据,所以:先运行接收端,后运行发送端,同时我们也定义接收端为阻塞式,(也就是等待数据发送过来)

UDP发送数据和接收数据图解:

UDP发送数据和接收数据代码的优化:


UDP协议发送数据:我们总是先运行接收端,再运行发送端发送端:
 1 package cn.itcast_03;
 2
 3 import java.io.IOException;
 4 import java.net.DatagramPacket;
 5 import java.net.DatagramSocket;
 6 import java.net.InetAddress;
 7
 8 public class SendDemo {
 9     public static void main(String[] args) throws IOException {
10         // 创建发送端的Socket对象
11         DatagramSocket ds = new DatagramSocket();
12
13         // 创建数据并打包
14         byte[] bys = "helloworld".getBytes();
15         DatagramPacket dp = new DatagramPacket(bys, bys.length,
16                 InetAddress.getByName("192.168.12.92"), 12345);
17
18         // 发送数据
19         ds.send(dp);
20
21         // 释放资源
22         ds.close();
23     }
24 }

 接收端:
 1 package cn.itcast_03;
 2
 3 import java.io.IOException;
 4 import java.net.DatagramPacket;
 5 import java.net.DatagramSocket;
 6
 7 /*
 8  * 多次启动接收端:
 9  *         java.net.BindException: Address already in use: Cannot bind
10  *         端口被占用。
11  */
12 public class ReceiveDemo {
13     public static void main(String[] args) throws IOException {
14         // 创建接收端的Socket对象
15         DatagramSocket ds = new DatagramSocket(12345);
16
17         // 创建一个包裹
18         byte[] bys = new byte[1024];
19         DatagramPacket dp = new DatagramPacket(bys, bys.length);
20
21         // 接收数据
22         ds.receive(dp);
23
24         // 解析数据
25         String ip = dp.getAddress().getHostAddress();
26         String s = new String(dp.getData(), 0, dp.getLength());
27         System.out.println("from " + ip + " data is : " + s);
28
29         // 释放资源
30         ds.close();
31     }
32 }

 

时间: 2024-12-29 12:12:22

Android(java)学习笔记80:UDP协议发送数据的相关文章

Java基础知识强化之网络编程笔记03:UDP之UDP协议发送数据 和 接收数据

1. UDP协议发送数据 和 接收数据 UDP协议发送数据: • 创建发送端的Socket对象 • 创建数据,并把数据打包 • 调用Socket对象的发送方法,发送数据包 • 释放资源  UDP协议接收数据:       • 创建接收端的Socket对象      • 创建数据包,接收数据(接收容器)      • 调用Socket对象的接收方法,接收数据包      • 解析数据包,并显示在控制台      • 释放资源 2. 代码实现 (1)首先我们先写发送端的程序,如下: 1 packag

TCP/IP详解学习笔记(6)-UDP协议

1.UDP简要介绍 UDP是传输层协议,和TCP协议处于一个分层中,但是与TCP协议不同,UDP协议并不提供超时重传,出错重传等功能,也就是说其是不可靠的协议. 2.UDP协议头 2.1.UDP端口号 由于很多软件需要用到UDP协议,所以UDP协议必须通过某个标志用以区分不同的程序所需要的数据包.端口号的功能就在于此,例如某一个UDP程序A在系统中注册了3000端口,那么,以后从外面传进来的目的端口号为3000的UDP包都会交给该程序.端口号理论上可以有2^16这么多.因为它的长度是16个bit

java学习笔记(二)之数据部分

数据类型 java数据类型 基本数据类型 数值型 整型byte/short/int/long   浮点型/double/float   字符型char     布尔型boolean 取值true  false         对象数据类型 类Class     接口 interface     数组array[]       类型 对象 位数 字节数 最小值 最大值 byte Byte 8    1 -128=2^7 127=2^7-1 short Short 16 2  -32768=2^15

java学习笔记 (2) —— Struts2类型转换、数据验证重要知识点

1.*Action.conversion-properties 如(point=com.test.Converter.PointListConverter) 具体操作类的配置文件 2.*Action.properties 如(invalid.fieldvalue.graduation=\u6bd5\u4e1a\u65e5\u671f\u8f93\u5165\u9519\u8bef) 具体字段错误提示信息的配置文件 2.struts.xml 中 <action name="register&

java/android 设计模式学习笔记(14)---外观模式

这篇博客来介绍外观模式(Facade Pattern),外观模式也称为门面模式,它在开发过程中运用频率非常高,尤其是第三方 SDK 基本很大概率都会使用外观模式.通过一个外观类使得整个子系统只有一个统一的高层的接口,这样能够降低用户的使用成本,也对用户屏蔽了很多实现细节.当然,在我们的开发过程中,外观模式也是我们封装 API 的常用手段,例如网络模块.ImageLoader 模块等.其实我们在开发过程中可能已经使用过很多次外观模式,只是没有从理论层面去了解它. 转载请注明出处:http://bl

java/android 设计模式学习笔记(10)---建造者模式

这篇博客我们来介绍一下建造者模式(Builder Pattern),建造者模式又被称为生成器模式,是创造性模式之一,与工厂方法模式和抽象工厂模式不同,后两者的目的是为了实现多态性,而 Builder 模式的目的则是为了将对象的构建与展示分离.Builder 模式是一步一步创建一个复杂对象的创建型模式,它允许用户在不知道内部构建细节的情况下,可以更精细地控制对象的构造流程.一个复杂的对象有大量的组成部分,比如汽车它有车轮.方向盘.发动机.以及各种各样的小零件,要将这些部件装配成一辆汽车,这个装配过

java/android 设计模式学习笔记(一)---单例模式

前段时间公司一些同事在讨论单例模式(我是最渣的一个,都插不上嘴 T__T ),这个模式使用的频率很高,也可能是很多人最熟悉的设计模式,当然单例模式也算是最简单的设计模式之一吧,简单归简单,但是在实际使用的时候也会有一些坑. PS:对技术感兴趣的同鞋加群544645972一起交流 设计模式总目录 java/android 设计模式学习笔记目录 特点 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 单例模式的使用很广泛,比如:线程池(threadpool).缓存(cache).对

java/android 设计模式学习笔记(7)---装饰者模式

这篇将会介绍装饰者模式(Decorator Pattern),装饰者模式也称为包装模式(Wrapper Pattern),结构型模式之一,其使用一种对客户端透明的方式来动态的扩展对象的功能,同时它也是继承关系的一种替代方案之一,但比继承更加灵活.在现实生活中也可以看到很多装饰者模式的例子,或者可以大胆的说装饰者模式无处不在,就拿一件东西来说,可以给它披上无数层不一样的外壳,但是这件东西还是这件东西,外壳不过是用来扩展这个东西的功能而已,这就是装饰者模式,装饰者的这个角色也许各不相同但是被装饰的对

java/android 设计模式学习笔记(13)---享元模式

这篇我们来介绍一下享元模式(Flyweight Pattern),Flyweight 代表轻量级的意思,享元模式是对象池的一种实现.享元模式用来尽可能减少内存使用量,它适合用于可能存在大量重复对象的场景,缓存可共享的对象,来达到对象共享和避免创建过多对象的效果,这样一来就可以提升性能,避免内存移除和频繁 GC 等. 享元模式的一个经典使用案例是文本系统中图形显示所用的数据结构,一个文本系统能够显示的字符种类就是那么几十上百个,那么就定义这么些基础字符对象,存储每个字符的显示外形和其他的格式化数据