前段时间在做智能公交系统项目,项目中的公交终端跟服务器,用UDP进行通信的。
客户端不断的将数据传到服务器,这里为什么采用UDP进行通信?因为 我们的客户端要不断的将数据传到服务器,传输的数据比较频繁,数据量比较多, 这里不要求数据的传输的准确性,所以采用了udp,而不是tcp.
项目中还存在另一种情景,就是服务器要向客户端下发命令。就是用户通过web可以向终端发送信息,这里也采用了udp,个人感觉这时可能采用TCP会更好一些,因为这里要有一个近回值,告诉服务器下发指令是否成功。因为udp通信,是无法知道返回值的,客户端必须人为的加上返回值。
服务器端代码如下。
在下发数据时,实际上服务器端是跑的udp的客户端。
屏幕剪辑的捕获时间: 2015-05-05 13:56
客户端实际跑的是udp服务程序
屏幕剪辑的捕获时间: 2015-05-05 14:12
<<UdpServer.java>>
udp打洞:
以上的想是挺好的,并且测试代码也已经测试通过,但是在3g移动网络下受限制,在3g下开一个服务器,没有指定绑定的某个端口号。比如手机也分配一个IP地址,这个地址也是内网,也不是公网的IP。当客户端向手机上的服务器端发数据,是发不过去的,因为并没有将端口打开。
这个问题如何解决呢?因为手机分配的地址也不是公网,是处于运营商内部的网络,也相当运营商公网里的一个内网。这里就用到udp打洞技术,利用客户端不断的向服务器发送心跳包,这样就可以暴露出客户端UDP传输的端口号,然后服务器就可以向客户端发送消息。