4.1.3 基于流量的加速实现
可以让用户通过软件连接到指定的服务器,这样就避开了网络阻塞。这个软件起到了中转的作用,其实并没有提高客户端或服务端的速度,而是将你的连接中转到其他服务器上,再通过其他服务器连接游戏服务器。这样建立起了独立通道,从而提高了连接速度。基于 VPN 的实现如下。
( 1)申请权限支持 VPN 程序的正常运行,必须要在 AndroidManifest.xml 中显式声明使用“ android.permission.BIND_VPN_SERVICE”权限。
( 2)获取( 1)中的权限后,根据系统对话框的返回值,判断是否成功开启 VPN,而VpnService.prepare 主要用于检查当前系统中是否已经存在一条 VPN 连接了,以及如果存在,是不是本程序创建的。因为目前 Android 系统只支持一条 VPN 连接,所以如果新的程序想建立一条 VPN 连接,必须先中断系统中当前存在的那条 VPN 连接,并且在第一次发送连接请求的时候弹出系统对话框让用户确认。
下面是 VpnService 发起的是否已经建立 VPN 连接的请求确认的核心代码:
1. Intent intent = VpnService.prepare(this);
2. if (intent != null) {
3. startActivityForResult(intent, 0);
4. } else
5. {
6. onActivityResult(0, RESULT_OK, null);
7. }
然后在 onActivityResult 函数回调中根据返回结果进行相应的处理,若 VPN 连接开启成功,则开启 VPN 服务拦截流量:
1. protected void onActivityResult(int request, int result, Intent data) {
2. if (result == RESULT_OK) {
3. //用户确认成功,开启 VPN 服务拦截流量
4. Intent intent = new Intent(this, MyVpnService.class);
5. startService(intent);
6. }
7. }
( 3)自有 MyVpnService 须继承 VpnService。
VpnService 类封装了建立 VPN 连接所必需的所有函数。通过 VpnService 可以构建一个tun0 网络虚拟端口,并且配置好合适的参数:
1. Builder builder = new Builder();
2. //表示虚拟网络端口的最大传输单元,如果发送的包长度超过这个数字,就会被分包
3. builder.setMtu(...);
4. //虚拟网络端口的 IP 地址
5. builder.addAddress(...);
6. //只有匹配上的 IP 数据包,才会被路由到虚拟端口上
7. builder.addRoute(...);
8. //端口的 DNS 服务器地址
9. builder.addDnsServer(...);
10. //DNS 域名的自动补齐
11. builder.addSearchDomain(...);
12. //VPN 连接的名字
13. builder.setSession(...);
14. //intent 指向一个配置页面,用来配置 VPN 连接
15. builder.setConfigureIntent(...);
16. //创建 tun0 虚拟网络接口
17. ParcelFileDescriptor interface = builder.establish();
<