一起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的方法总结)

一起Talk Android吧(第三百七十九回:让ViewPager一屏幕显示三页)

一起Talk Android吧(第三百二十六回:Android中的布局编辑器)