手机卫士02-与服务器交互

好啦,我们继续我们昨天的那个项目,昨天我们只完成了一个程序启动时的欢迎界面,但是提到了,启动那个界面时会进行版本的检查,所以今天我们就做那个版本的检查那一块。

既然要做版本检查,那肯定要有服务器啦,所以我们就用到tomcat啦,因为这个项目是Android, 所以我就不写那个服务器端的程序啦,我只用tomcat来进行一个简单的从服务器读取数据,然后更新程序。不会专门写一个服务器端来进行业务的处理。

好,废话不多说,可能有些人还没接触过Web方面的,所以我把tomcat的搭建也简单的说一下,大神可以直接跳到下面去。

首先,我们去tomcat官网上下载一个tomcat 下载地址

在这里选择是32位的还是64位的


下载下来后,安装也很简单,直接解压出来就行啦(前提是你的java环境要正确)

解压好之后,我们就可以去到它的bin目录下面,双击那个startup.bat文件啦


然后我们就会看到一个黑呼呼的界面


然后,我们去浏览器输入 http://localhost:8080/  然后出现下面的界面,那就说明你的tomcat配置成功了


那么,我们的服务器配置好之后,我们就要用它来为我们的app做一些东西啦

首先,我们在tomcat的webapps目录下载新建一个文件夹叫Security(这个是个人喜欢的,因为我们app叫Security)

update.xml里面的内容

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <update>
  3.         <version>1.0</version>
  4.         <description>这里写一些这个版本的特点</description>
  5.         <apkurl>http://192.168.1.5:8080/Security/new.apk</apkurl>
  6.         <!--这里的ip地址一定要写你服务器所在的电脑的ip地址,我们会在Security这个目录下面放置一下new.apk的,用来更新的-->
  7. </update>

复制代码
好啦,现在测试一下,在浏览器里面输入http://localhost:8080/Security/update.xml  如果能够看到我们刚刚写的update.xml里面的内容,那么,你的服务器就配置成功啦!先恭喜你,你又会弄服务器啦!!!!!ps:因为这个要涉及服务器这些知识,所以我们这个app运行的手机上的ip一定要和你运行tomcat那台电脑上的ip是处于同一个局域网的,当时如果有外部ip那就不同,所以最好就是电脑和手机接同一个wifi这个一般会在同一个局域网啦,当然,用模拟器就一定是在同一个局域网啦 好啦,配置好了服务器后,我们就可以继续我们的项目啦,因为要和服务器交互,那么,我们肯定要把交互的地址存起来的啦,所以我们在我们的项目的values目录下新建一个config.xml文件
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <resources>
  3.    
  4.     <string name="serverUrl">http://192.168.1.5:8080/Security/update.xml</string>
  5.    
  6. </resources>

复制代码
好啦,现在,我们的任务是从服务器上读取到update.xml里面的内容,然后再解析它,拿到apk的下载地址,和最新的版本与当时的版本比较嘛,看一下要不要下载,所以我们就要有一个model来存放这些更新的信息了嘛所以我们就新建一个类com.xiaobin.security.domain.UpdateInfo
  1. package com.xiaobin.security.domain;

  2. public class UpdateInfo
  3. {
  4.         private String version;
  5.         private String description;
  6.         private String url;
  7.        
  8.         public String getVersion()
  9.         {
  10.                 return version;
  11.         }
  12.         public void setVersion(String version)
  13.         {
  14.                 this.version = version;
  15.         }
  16.         public String getDescription()
  17.         {
  18.                 return description;
  19.         }
  20.         public void setDescription(String description)
  21.         {
  22.                 this.description = description;
  23.         }
  24.         public String getUrl()
  25.         {
  26.                 return url;
  27.         }
  28.         public void setUrl(String url)
  29.         {
  30.                 this.url = url;
  31.         }
  32.        
  33. }

复制代码
然后呢,我们要从服务器上读取到一个update.xml嘛,所以我们也要新建一个类,用来与服务器交互啦所以新建一个类com.xiaobin.security.engine.UpdateInfoService
  1. package com.xiaobin.security.engine;

  2. import java.io.InputStream;
  3. import java.net.HttpURLConnection;
  4. import java.net.URL;

  5. import android.content.Context;

  6. import com.xiaobin.security.domain.UpdateInfo;

  7. public class UpdateInfoService
  8. {
  9.        
  10.         private Context context;
  11.        
  12.         public UpdateInfoService(Context context)
  13.         {
  14.                 this.context = context;
  15.         }
  16.        
  17.         public UpdateInfo getUpdateInfo(int urlId) throws Exception
  18.         {
  19.                 String path = context.getResources().getString(urlId);//拿到config.xml里面存放的地址
  20.                 URL url = new URL(path);
  21.                 HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();//开启一个http链接
  22.                 httpURLConnection.setConnectTimeout(5000);//设置链接的超时时间,现在为5秒
  23.                 httpURLConnection.setRequestMethod("GET");//设置请求的方式
  24.                 InputStream is = httpURLConnection.getInputStream();//拿到一个输入流。里面包涵了update.xml的信息
  25.                 return UpdateInfoParser.getUpdateInfo(is);//解析xml
  26.         }

  27. }

复制代码
刚刚上面那个类里面有一个解析xml的操作,所以我们现在把解析xml的这个类也写一下所以新建一个类com.xiaobin.security.engine.UpdateInfoParser
  1. package com.xiaobin.security.engine;

  2. import java.io.InputStream;

  3. import org.xmlpull.v1.XmlPullParser;

  4. import android.util.Xml;

  5. import com.xiaobin.security.domain.UpdateInfo;

  6. public class UpdateInfoParser
  7. {
  8.        
  9.         public static UpdateInfo getUpdateInfo(InputStream is) throws Exception
  10.         {
  11.                 UpdateInfo info = new UpdateInfo();
  12.                 XmlPullParser xmlPullParser = Xml.newPullParser();
  13.                 xmlPullParser.setInput(is, "utf-8");
  14.                 int type = xmlPullParser.getEventType();
  15.                 while(type != XmlPullParser.END_DOCUMENT)
  16.                 {
  17.                         switch(type)
  18.                         {
  19.                                 case XmlPullParser.START_TAG :
  20.                                         if(xmlPullParser.getName().equals("version"))
  21.                                         {
  22.                                                 info.setVersion(xmlPullParser.nextText());
  23.                                         }
  24.                                         else if(xmlPullParser.getName().equals("description"))
  25.                                         {
  26.                                                 info.setDescription(xmlPullParser.nextText());
  27.                                         }
  28.                                         else if(xmlPullParser.getName().equals("apkurl"))
  29.                                         {
  30.                                                 info.setUrl(xmlPullParser.nextText());
  31.                                         }
  32.                                         break;
  33.                                        
  34.                                 default :
  35.                                         break;
  36.                         }
  37.                         type = xmlPullParser.next();
  38.                 }
  39.                 return info;
  40.         }

  41. }

复制代码
好啦,现在我们回去给我们昨天写的那个SplashActivity加上一些逻辑啦
  1. package com.xiaobin.security.ui;

  2. import android.app.Activity;
  3. import android.app.AlertDialog;
  4. import android.content.DialogInterface;
  5. import android.content.pm.PackageInfo;
  6. import android.content.pm.PackageManager;
  7. import android.content.pm.PackageManager.NameNotFoundException;
  8. import android.os.Bundle;
  9. import android.view.Window;
  10. import android.view.WindowManager;
  11. import android.view.animation.AlphaAnimation;
  12. import android.widget.LinearLayout;
  13. import android.widget.TextView;
  14. import android.widget.Toast;

  15. import com.xiaobin.security.R;
  16. import com.xiaobin.security.domain.UpdateInfo;
  17. import com.xiaobin.security.engine.UpdateInfoService;

  18. public class SplashActivity extends Activity
  19. {
  20.         private TextView tv_version;
  21.         private LinearLayout ll;
  22.        
  23.         private UpdateInfo info;
  24.        
  25.         @Override
  26.         protected void onCreate(Bundle savedInstanceState)
  27.         {
  28.                 super.onCreate(savedInstanceState);
  29.                 requestWindowFeature(Window.FEATURE_NO_TITLE);
  30.                 setContentView(R.layout.splash);
  31.                 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
  32.                
  33.                 tv_version = (TextView) findViewById(R.id.tv_splash_version);
  34.                 String version = getVersion();
  35.                 tv_version.setText("版本号  " + version);
  36.                
  37.                 ll = (LinearLayout) findViewById(R.id.ll_splash_main);
  38.                 AlphaAnimation alphaAnimation = new AlphaAnimation(0.0f, 1.0f);
  39.                 alphaAnimation.setDuration(2000);
  40.                 ll.startAnimation(alphaAnimation);
  41.                
  42.                 if(isNeedUpdate(version))
  43.                 {
  44.                         showUpdateDialog();
  45.                 }
  46.         }
  47.        
  48.         private void showUpdateDialog()
  49.         {
  50.                 AlertDialog.Builder builder = new AlertDialog.Builder(this);
  51.                 builder.setIcon(android.R.drawable.ic_dialog_info);
  52.                 builder.setTitle("升级提醒");
  53.                 builder.setMessage(info.getDescription());
  54.                 builder.setCancelable(false);
  55.                
  56.                 builder.setPositiveButton("确定", new DialogInterface.OnClickListener()
  57.                 {
  58.                        
  59.                         @Override
  60.                         public void onClick(DialogInterface dialog, int which)
  61.                         {
  62.                                 // TODO Auto-generated method stub
  63.                                
  64.                         }
  65.                 });
  66.                 builder.setNegativeButton("取消", new DialogInterface.OnClickListener()
  67.                 {

  68.                         @Override
  69.                         public void onClick(DialogInterface dialog, int which)
  70.                         {
  71.                                 // TODO Auto-generated method stub
  72.                                
  73.                         }
  74.                        
  75.                 });
  76.                 builder.create().show();
  77.         }

  78.         private boolean isNeedUpdate(String version)
  79.         {
  80.                 UpdateInfoService updateInfoService = new UpdateInfoService(this);
  81.                 try
  82.                 {
  83.                         info = updateInfoService.getUpdateInfo(R.string.serverUrl);
  84.                         String v = info.getVersion();
  85.                         if(v.equals(version))
  86.                         {
  87.                                 System.out.println("不用更新");
  88.                                 return false;
  89.                         }
  90.                         else
  91.                         {
  92.                                 System.out.println("要更新");
  93.                                 return true;
  94.                         }
  95.                 }
  96.                 catch (Exception e)
  97.                 {
  98.                         e.printStackTrace();
  99.                         Toast.makeText(this, "获取更新信息异常,请稍后再试", Toast.LENGTH_SHORT).show();
  100.                 }
  101.                 return false;
  102.         }

  103.         private String getVersion()
  104.         {
  105.                 try
  106.                 {
  107.                         PackageManager packageManager = getPackageManager();
  108.                         PackageInfo packageInfo = packageManager.getPackageInfo(getPackageName(), 0);
  109.                        
  110.                         return packageInfo.versionName;
  111.                 }
  112.                 catch (NameNotFoundException e)
  113.                 {
  114.                         e.printStackTrace();
  115.                         return "版本号未知";
  116.                 }
  117.         }

  118. }

复制代码
因为我们访问了Internet。所以要在AndroidManifest里面加上权限
  1. <uses-permission android:name="android.permission.INTERNET"/>
复制代码
好啦,现在可以进行测试一下啦,只要修改update.xml里面的那个version,那样就会提示下载的啦,今天的代码有点多,而且有点乱,所以如果有什么不明白的,或出了什么问题的,都可以留言交流,最后提示一个,记得要把服务器打开再测试,不然就没效果啦 Security_02_服务器端的交互.rar(733.38 KB, 下载次数: 396)
深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值