现在的位置: 首页 > 综合 > 正文

android手机与服务器基于UDP协议的通信

2018年07月12日 ⁄ 综合 ⁄ 共 1051字 ⁄ 字号 评论关闭

由于第一次写博客,所以在表述上难免会有所欠缺,欢迎大家给予指正!

首先描述一下我所做的小项目:项目是基于android手机的百度地图位置共享应用的开发。由于百度服务器暂时没有提供api支持获取别的用户手机的位置。因此要实现一部手机与其他手机进行定位共享,必须采用socket进行通信。基于UDP协议的优点,项目通信模块采用了UDP协议进行定位信息的接收和发送。由于手机客户端一方面要每隔一定时间就要接收百度地图服务器发送过来的本手机的定位信息、并立即发送给自己的服务器,同时手机客户端一方面要不停的从自己的服务器那里接收其他手机发送过来的定位信息。因此,如果仅采用一个socket进行定位信息的接收和发送,容易造成socket阻塞(有可能客户端正在向服务器发送数据,这时,服务器也正在向客户端发送数据),程序不好控制。因此,我采用两个socket与服务器进行通信。这样一来,有两个实现方式:一是,android在发送定位信息时的身份是客户端的形式,当android手机接收定位信息时的身份是服务器端的形式(即android客户端在某个固定端口监听,服务器向这个端口发送定位数据)。二是,android客户端两个socket都是以客户端的身份和服务器进行通信。第一种实现发送是不容易实现的,主要基于两点:一是android手机所在外网的ip地址不好获取,网上比较可行的解决方案是android手机通过连接第三方服务器,第三方服务器在把android手机的外网ip返回回来。(我不是很喜欢这种方式)。二是android手机的socket所监听的端口号不能自己手动固定,也就是说socket监听的端口号自己设置不了,这就造成了服务器接收到定位信息后不知道向手机的哪个端口发送。因此,我使用第二个方式用socket与服务器进行定位通信。

通信原理图:

在上图中,1代表一个socket连接,2代表另一个socket连接。(UDP协议是非连接型的协议,这里使用两条线代表两个连接是为了更好的描述问题),由于android手机在发送一个数据包给远程服务器之后,远程服务器一定能从数据包中获取到发送该数据包的ip+端口号,因此我们让一号socket给服务器发送一个简短的消息后,就进入到循环监听服务器发送其他手机定位信息的状态。2号socket则一直给服务器发送android手机的定位。而在服务器这里只需要记录一号socket的端口号和ip就能向android手机发送其他手机的定位。

我的思路就是这样,这里就不附代码了。

抱歉!评论已关闭.