Android网络功能开发(7)——UDP协议通信

UDP通信的流程中,接收端先监听某个端口,等待接收其它设备发来的数据包。发送端准备好数据包后,发送给接收端。接收端只需一个接收线程就可接收多个客户端发来的数据包。一个应用可以同时包含发送端和接收端。

这里通过一个例子介绍如何代码如何编写。这个例子是一个Android应用和一个JavaSE程序通过UDP通信。双方都同时实现接收端和发送端,双方可以像聊天一样随意地互相发送消息。

先看Android端接收消息的的代码。

当点击UDP的Listen按钮时,启动接收线程。在线程中先以端口号为参数创建DatagramSocket对象,再创建一个空的DatagramPacket对象用于存放收到的数据,接着再循环中调用DatagramSocket对象的receive方法。一旦接收到数据,receive方法就会返回,并且把数据保存在packet对象中。通过packet对象的getData方法,取出数据,然后构造出一个消息的字符串。最后用sendMessage方法把这个消息字符串传递给主线程显示到界面上。这是处理接收消息的代码。

Android端发送消息的代码是这样的。

先从Server文本框读取服务器的IP地址,从Content文本框读取消息内容。然后用他们创建一个DatagramPacket对象,也就是要发送的数据包。再创建一个DatagramSocket对象,调用它的send方法把数据包发出去。这些代码涉及网络操作,要在AsyncTask中异步执行。

再看JavaSE端的代码。JavaSE端的接收消息的代码都在接收线程中,主要流程是把接收到的消息输出。

接收数据的代码和Android端是一样的,都是创建一个DatagramSocket对象和一个空的DatagramPacket对象,调用DatagramSocket对象的receive方法,接收到的消息就会保存在DatagramPacket对象中。

JavaSE端的发送消息的代码在主线程中,主要流程是把键盘接收到的消息发送到Android端。

发送数据的代码和Android端是一样的,也是创建一个DatagramSocket对象,把要发送的数据保存到一个DatagramPacket对象中,然后调用DatagramSocket对象的send方法完成发送。

使用Socket接口时,经常需要进行字符转换。程序内部保存文本是字符串(String)形式,而网络传输过程中是字节流(byte[])形式,所以在发送和接收处需要进行转换。发送方需要将字符串或字符流转换为字节流,也就是String 到 byte[] 或 字符输出流到字节输出流( Writer => OutputStream)。接收方需要将字节流转换为字符串或字符流,也就是byte[] 到 String 或 字节输入流到字符输入流(InputStream => Reader)。因为通信是双向的,所以一般有四处需要转换。这四处都需要指出字符编码方式,如最常用的”utf-8”,否则容易出现中文乱码问题。

用模拟器测试UDP通信需要进行端口映射,因为模拟器和PC的IP地址相同,所有网络数据默认都会发送到PC的端口。通过端口映射,才能将发送到PC端口的数据转到模拟器端口,具体方法是:

1、用telnet连接模拟器控制台,命令是:telnet localhost 5554。(5554是模拟器的端口号,一般缺省是5554)。如果windows的telnet命令没打开,需要在控制面板-程序-启用或关闭Windows功能中打开。

2、授权,需要先执行auth <auth_token>命令,才能执行后面的端口映射命令,防止别人远程控制模拟器。<auth_token>是在C:\Users\<当前用户>\目录下的.emulator_console_auth_token文件中的内容,可以用windows记事本打开,复制到命令行窗口。

3、执行端口映射,命令是:redir add udp:8888:8888。意思是把PC8888端口接收到的UDP数据

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nanoage

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值