用GPRS模块如何实现UDP通信
我想实现gprs模块(client)上网,和一个具有公网ip的计算机(Server)进行数据通信,想采用UDP协议。对UDP协议不太了解,现请教高手。
问题:gprs拨号获得的IP是动态的并且是内网IP,client 即使把这个IP传给server也没有用啊,server能用这个IP向它发送数据么??
[解决办法]
照你这么说,内网用户就不能用qq了?
决定用户的除了ip还有端口,同个内网的多个用户在访问外网时的端口是不一样的.这个路由器会去处理的.
不过gprs网络对于一段时间没有通讯的udp资源会进行回收,导致client对外的端口号发生改变.所以如果你要随时随地都可以由server主动联系client,那必须每个一段时间发送一点数据给client,就是一般所说的"心跳包"
以前我们做的gprs设备也出现过拨号连接上一段时间后就莫明其妙断开的情况,后来发现把qq挂着就没事了,我猜原因就是qq本身也是基于udp的,所以qq的server会定时发送心跳包来维持client对外的端口
[解决办法]
差不多吧
实际上所谓的"端口"可以理解为就是程序代号,比如你同时开qq和msn,收到数据操作系统怎么知道数据是给qq的还是给msn的呢?就是通过端口.
路由器其实也是一样,2个内网用户同时浏览网页,http服务器回传的网页数据路由器怎么知道给用户1还是用户2呢?也是通过端口.
你说的有点不太准确,过程是,client上的应用程序绑定本地一个端口(比如是4000),通过这个端口发送请求给路由器,路由器由此记录下client的内网ip和端口(4000),然后路由器分配自己的一个空闲端口(比如是8000),通过这个端口(8000)发送请求给server.
而对于server,它没有任何关于client的信息,它要做的只是回信息到路由器的外网ip的8000这个端口.路由器收到发送到其8000端口的数据后会再转发给client.
多级路由的转发原理也是一样的.
所以实际上你所担心的大部分工作其实都不需要你去关心的.你的client只管往server发数据就可以了.server接收数据的时候会得到一个发送源的ip和端口信息(这并不是client的ip个端口,但你无需关心),然后server就往这个源回信息就ok了.
你现在最需要关心的是gprs获得的临时udp端口可以维持多久,需要什么样的机制去维持. 我以前做的项目最终还是采用tcp去做的,而且也是5年前了,现在移动是如何处理的还真不太清楚.