一起Talk Android吧(第三百二十九回:Android中网络通信之UPD Socket)
Posted talk_8
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一起Talk Android吧(第三百二十九回:Android中网络通信之UPD Socket)相关的知识,希望对你有一定的参考价值。
各位看官们,大家好,上一回中咱们说的是android中网络通信之UDP概述的例子,这一回中咱们说的例子是UDP Socket。闲话休提,言归正转。让我们一起Talk Android吧!
我们在前面章回中介绍了UDP通信的基本流程,本章回中主要介绍与UDP通信相关的Socket接口Android平台没有提供专门的Socket接口,而是直接使用Java中的Socket接口。
创建Socket
在UDP通信过程中使用DatagramSocket
类来创建Socket,通过该类的构造方法创建类的对象相当于创建了一个Socket,该类常用的的构造方法如下:
public DatagramSocket() throws SocketException
public DatagramSocket(int port) throws SocketException
public DatagramSocket(int port, InetAddress laddr) throws SocketException
构造方法中的参数主要是电脑的端口和IP地址,如果使用无参的构造方法那么端口由系统自动分配,IP地址默认为当前电脑的IP地址;
对于发送方,我们不需要关注端口,由系统自动分配就可以;对于接收方,我们需要指定一个端口,而不是让系统自动分配。
至于IP地址肯定是使用当前电脑的IP地址,除非电脑有多个IP地址;
因此,使用哪个构造方法来创建Socket对象取决于项目的用途,如果Socket用来发送数据使用无参构造方法就可以,如果Sockect用来接收数据,则必须使用带有端口的构造方法。注意使用构造方法时需要对异常做处理。
创建数据包
数据包通过DatagramPacket
类来表示,创建该类的对象相当于创建了一个数据包,该类常用的的构造方法如下:
public DatagramPacket(byte buf[], int length)
public DatagramPacket(byte buf[], int length,InetAddress address, int port)
构造方法中的buf表示数据包中存放数据的缓冲区,length表示该缓冲区的大小,其它参数通过参数名称就可以看出来,因此不做详细介绍。
通常情况下接收方使用两个参数的构造方法创建数据包,而发送方则使用四个参数的构造方法创建数据包。注意:发送方需要在数据包中封装IP地址和端口号,这个IP地址和端口号是准备接收此数据包的电脑IP地址和端口号。
数据包中的数据以字节形式存放,发送方和接收方需要把数据转换为字节形式,因此该类还提供了一些方法来操作被封装的数据,详细如下:
//修改数据包中被封装的数据
public synchronized void setData(byte[] buf)
//获取数据包被封装的数据
public synchronized byte[] getData()
//获取数据包中被封装数据的大小
public synchronized int getLength()
数据包中数据的长度是有限的,其理论值:IPV4为65507,IPV6为65536.
数据包的长度不能超过此理论值,超过后会被丢弃或者分片。不过大部分数据包中的数据长度不超过512,因此可以将512当作经验值来使用。
接收数据
DatagramSocket类提供了专门的方法来接收数据,具体如下:
receive(DatagramPacket p) throws IOException
该方法可以获取从端口发来的数据,数据被封装在DatagramPacket类型的参数中,通过DatagramPacket类的getData()
方法可以获取到传送来的数据。不过getData()
方法返回的是byte类型的数组,可以依据项目需要对数据类型做转换。
注意:receive()方法没有收到数据时会一直阻塞,直到接收到数据为止。
发送数据
DatagramSocket类提供了专门的方法来发送数据,具体如下:
send(DatagramPacket p) throws IOException
该方法用来发送数据,数据被封装在DatagramPacket类型的参数中,通过DatagramPacket类的setData()方法可以修改被传送的数据。
再次强调一下:发送数据一定要把IP地址和端口封装到数据包中,不然无法完成正常的通信。
关闭Socket
DatagramSocket类提供了专门的方法来关闭Socket,具体如下:
public void close()
通信结束后一定要关闭Socket,不然会造成内存泄漏,而且被监听的端口无法被回收利用。
最后,我们对本章回的内容做一个总结:
- 1.UDP通信过程中使用DatagramSocket类来创建Socket;
- 2.DatagramSocket类提供了专门的方法用来发送和接收数据;
- 3.UDP通信中的数据包通过DatagramPacket类来表示,该类以字节形式封装数据;
- 4.数据包中还封装接收方的IP地址和端口号,数据包中的数据大小不能超过理论值;
- 5.UDP通信结束后一定要关闭Socket,否则会引起内存泄漏;
看官们,关于Android中网络通信之UDP Socket的例子咱们就介绍到这里,欲知后面还有什么例子,且听下回分解!
以上是关于一起Talk Android吧(第三百二十九回:Android中网络通信之UPD Socket)的主要内容,如果未能解决你的问题,请参考以下文章
一起Talk Android吧(第三百三十九回: Android中的OkHttp二)
一起Talk Android吧(第三百一十九回:Android中网络通信之TCP概述)
一起Talk Android吧(第四百二十九回:在Android中使用MQTT通信三)
一起Talk Android吧(第三百九十九回:获取Bitmap的方法总结)