【转】Android Https服务器端和客户端简单实例
转载地址:http://blog.csdn.net/gf771115/article/details/7827233
AndroidHttps服务器端和客户端简单实例
工具介绍
Eclipse3.7
Tomcat 6.0.18(免安装版)
Android2.1开发环境(在Eclipse中配置好)
前提条件
JDK环境要使用我们自己安装的,笔者JDK安装目录为D:\Java\jdk1.6.0_22,在Eclipse的Window-preference-installedJREs中,只选用我们自己安装的JRE,如图所示:
在Eclipse与Tomcat整合的时候,也需要选择此运行环境:
一.搭建服务器端
1.在Eclipse中新建Dynamic Web Project,取名为HttpsServer:
2.index.jsp内容如下:
<%@ pagelanguage="java" import="java.util.*"pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme() +"://"
+ request.getServerName() +":" + request.getServerPort()
+ path + "/";
%>
<!DOCTYPE HTML PUBLIC"-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<basehref="<%=basePath%>">
<title>name+age JSPPage</title>
<metahttp-equiv="pragma" content="no-cache">
<metahttp-equiv="cache-control" content="no-cache">
<metahttp-equiv="expires" content="0">
<metahttp-equiv="keywords"content="keyword1,keyword2,keyword3">
<metahttp-equiv="description" content="This is my page">
</head>
<body>
<form action="/HttpsServer/TestService"method="get">
name: <input name="name"type="text" /><br /> age: <input
name="age" type="text"/><br /> <input type="submit" value="submit"/> <input
type="reset" value="reset"/>
</form>
<form action="/HttpsServer/TestService"method="post">
name: <inputname="name" type="text" /><br /> age: <input
name="age"type="text" /><br /> <input type="submit"value="submit"/> <input
type="reset"value="reset" />
</form>
</body>
</html>
这里其实是复用了之前Http调研的代码,我们关心的是我们手机端能不能访问该服务器端,还涉及到传递数据,具体数据显示在TestService表示。
3.TestService代码如下:
package com.veer;
importjava.io.IOException;
importjava.io.PrintWriter;
import javax.servlet.ServletException;
importjavax.servlet.http.HttpServlet;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
public class TestServiceextends HttpServlet {
private static final long serialVersionUID= 1L;
protected void doGet(HttpServletRequestreq, HttpServletResponse resp)
throws ServletException,IOException {
String name =req.getParameter("name");
String age =req.getParameter("age");
resp.setContentType("text/html");
PrintWriter out = resp.getWriter();
out.println("<html><head><title>name&age</title></head");
out.println("<body>name:" + name + "<br>");
out.println("age:" + age +"<br></body></html>");
System.out.println("name=" +name);
System.out.println("age=" +age);
out.flush();
}
protected void doPost(HttpServletRequestreq, HttpServletResponse resp)
throws ServletException,IOException {
req.setCharacterEncoding("utf-8");
String name =req.getParameter("name");
String age =req.getParameter("age");
resp.setContentType("text/html");
resp.setCharacterEncoding("utf-8"); // 设置返回给客户端的文本格式,可解决文字编码不统一的问题
PrintWriter out = resp.getWriter();
out.println("<html><head><title>name&age</title></head");
out.println("<body>name:" + name + "<br>");
out.println("age:" + age +"<br></body></html>");
System.out.println("name=" +name);
System.out.println("age=" +age);
out.flush();
}
}
4.修改web.xml文件,在倒数第二行加入:
<servlet>
<description>This is the descriptionof my J2EE component</description>
<display-name>This is the displayname of my J2EE component</display-name>
<servlet-name>TestService</servlet-name>
<servlet-class>com.veer.TestService</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TestService</servlet-name>
<url-pattern>/TestService</url-pattern>
</servlet-mapping>
至此,未加密钥的服务器端就已经搭建好。
二.配置密钥
2.1 在D盘建立文件夹cer,再在里面建立文件夹tomcat;
2.2 进入cmd,依次键入cd\、d:、cd cer、cd tomcat,进入到D:\cer\tomcat目录下面;
2.3 生成服务器端密钥
键入D:\cer\tomcat>
keytool -genkey -aliastomcat -keyalg RSA -keystore server.keystore -validity 36000
解释:keytool是jdk下的命令行工具。
alias 随意指定,表示别名。keyalg表示加密算法为RSA,输出文件为server.keystore
这里面需要输入密码(我们输入123456),另外注意“您的名字与姓氏是什么?”,这一项要输入tomcat所在主机的IP或域名,客户端访问tomcat时会涉及到这个地址,笔者局域网的IP是192.168.1.213,所以我们输入该IP。
此时在D:\cer\tomcat里面就会生成一个server.keystore文件,不要关闭cmd,还有操作要进行;
2.4 用server.keystore生成server.cer
键入:D:\cer\tomcat>
keytool -export -aliastomcat -file server.cer -keystore server.keystore -storepass 123456
此时在D:\cer\tomcat里面就会生成一个server.cer文件。解释:这个是浏览器可以识别的证书,用于导入浏览器。
不要关闭cmd,还有操作要进行。
2.5 这个时候tomcat就可以启动ssl了,以tomcat6.0为例,在server.xml中拷入(或是更改)如下片段:
<Connector SSLEnabled="true"acceptCount="100" clientAuth="false" disableUploadTimeout="true"enableLookups="true"keystoreFile="D:/cer/tomcat/server.keystore"keystorePass="123456" maxSpareThreads="75"maxThreads="200" minSpareThreads="5" port="8443"protocol="org.apache.coyote.http11.Http11NioProtocol"scheme="https" secure="true"sslProtocol="TLS"/>
其中clientAuth="false",表示单向验证,为true的话则是双向认证。
这时启动tomcat,打开IE,输入https://192.168.1.213:8443/会提示没有证书,但能点进去。
我们可以双击刚才生成的server.cer,把它导入“受信任的根证书颁发机构”,就能看到浏览器上的小锁了。
三.特别说明
我们需要下载bcprov-jdk15-135.jar及sunjce_provider.jar(可能已经存在),放入D:\Java\jdk1.6.0_22\jre\lib\ext下面。同时要修改D:\Java\jdk1.6.0_22\j\jre\lib\security\java.security文件,
找到security.provider.1=sun.security.provider.Sun这行,这里有好几行,在最后一行加上security.provider.10=org.bouncycastle.jce.provider.BouncyCastleProvider,笔者本来有9号,所以新一行的序号为10。
在cmd中继续键入:D:\cer\tomcat>
keytool -import -aliastomcat -file server.cer -keystore server_trust.keystore -storepass 123456-storetype BKS -providername "BC"
这时候在D:\cer\tomcat里面就会生成一个server_trust.keystore文件。
解释:将在客户端用到这个信任的密钥。
四.搭建客户端
按照正常的步骤,我们建立一个Android Project,需要注意的是新建立一个文件夹res/raw,将server_trust.keystore拷贝至其中,在AndroidMainfest.xml中加入。如下图所示:
HttpsClientActivity 代码如下:
package com.veer;
importjava.io.InputStream;
importjava.security.KeyStore;
importorg.apache.http.HttpEntity;
importorg.apache.http.HttpResponse;
importorg.apache.http.client.HttpClient;
importorg.apache.http.client.methods.HttpGet;
importorg.apache.http.client.methods.HttpUriRequest;
importorg.apache.http.conn.scheme.Scheme;
importorg.apache.http.conn.ssl.SSLSocketFactory;
importorg.apache.http.impl.client.DefaultHttpClient;
importandroid.app.Activity;
import android.os.Bundle;
import android.view.View;
importandroid.view.View.OnClickListener;
importandroid.widget.Button;
public classHttpsClientActivity extends Activity {
/** Called when the activity is firstcreated. */
private Button testButton;
private String httpsUrl ="https://192.168.1.213:8443/HttpsServer/TestService";
HttpClient hc = new DefaultHttpClient();
@Override
public void onCreate(BundlesavedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
testButton = (Button)findViewById(R.id.testButton);
testButton.setOnClickListener(newOnClickListener() {
@Override
public void onClick(View v) {
try {
initKey();
} catch (Exception e) {
e.printStackTrace();
}
try {
String result = getData(httpsUrl);
System.out.println("result=" + result);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
private void initKey() throws Exception {
KeyStore trustStore =KeyStore.getInstance("BKS");
trustStore.load(
getBaseContext().getResources().openRawResource(
R.raw.server_trust),"123456".toCharArray());
SSLSocketFactory socketFactory = newSSLSocketFactory(trustStore);
Scheme sch = newScheme("https", socketFactory, 8443);
hc.getConnectionManager().getSchemeRegistry().register(sch);
}
private String getData(String url) throwsException {
HttpUriRequest hr = new HttpGet(url);
HttpResponse hres = hc.execute(hr);
HttpEntity he = hres.getEntity();
InputStream is = he.getContent();
StringBuffer sb = new StringBuffer();
byte[] bytes = new byte[1024];
for (int len = 0; (len =is.read(bytes)) != -1;) {
sb.append(new String(bytes, 0, len,"utf-8"));
}
return sb.toString();
}
}
main.xml代码如下:
<?xmlversion="1.0" encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<Button
android:id="@+id/testButton"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="HTTPS Test"/>
</LinearLayout>
将该Android项目运行起来,点击按钮,在logcat中就可以看到打印信息:
在console控制台中可以看到信息:
至迟,手机端对https服务器简单的访问已经完成,至于其他的具体功能还要靠大家自己去扩展和封装。
【转】Android Https服务器端和客户端简单实例的更多相关文章
- Android HTTPS(1)概念和简单示例
Security with HTTPS and SSL The Secure Sockets Layer (SSL)—now technically known as Transport Layer ...
- Android Fragment 简单实例
Android上的界面展示都是通过Activity实现的.Activity实在是太经常使用了.我相信大家都已经很熟悉了,这里就不再赘述. 可是Activity也有它的局限性,相同的界面在手机上显示可能 ...
- android json解析及简单例子+Android与服务器端数据交互+Android精彩案例【申明:来源于网络】
android json解析及简单例子+Android与服务器端数据交互+Android精彩案例[申明:来源于网络] android json解析及简单例子:http://www.open-open. ...
- android Jni NDK开发环境搭建及其简单实例的编写
android Jni NDK开发环境搭建及其简单实例的编写 由于工作需要,需要采用开发想要的JNI,由于之前没有接触过安卓的开发,所以更加网上的帖子,学习了下.遇到了些问题,然后总结下学习过程中 ...
- SignalR代理对象异常:Uncaught TypeError: Cannot read property 'client' of undefined 推出的结论 SignalR 简单示例 通过三个DEMO学会SignalR的三种实现方式 SignalR推送框架两个项目永久连接通讯使用 SignalR 集线器简单实例2 用SignalR创建实时永久长连接异步网络应用程序
SignalR代理对象异常:Uncaught TypeError: Cannot read property 'client' of undefined 推出的结论 异常汇总:http://www ...
- Android单片机与蓝牙模块通信实例代码
Android单片机与蓝牙模块通信实例代码 参考路径:http://www.jb51.net/article/83349.htm 啦啦毕业了,毕业前要写毕业设计,需要写一个简单的蓝牙APP进行交互,通 ...
- Android AsyncTask 深度理解、简单封装、任务队列分析、自定义线程池
前言:由于最近在做SDK的功能,需要设计线程池.看了很多资料不知道从何开始着手,突然发现了AsyncTask有对线程池的封装,so,就拿它开刀,本文将从AsyncTask的基本用法,到简单的封装,再到 ...
- Centos7的安装、Docker1.12.3的安装,以及Docker Swarm集群的简单实例
目录 [TOC] 1.环境准备 本文中的案例会有四台机器,他们的Host和IP地址如下 c1 -> 10.0.0.31 c2 -> 10.0.0.32 c3 -> 10.0.0. ...
- 实现服务器端与客户端的高频实时通信 SignalR(2)
说明:本篇文章与上篇文章 实现服务器端与客户端的实时通信 SignalR(1) 基本代码类似,只是做了些处理 高频 的改动. 一.本文出处:SignalR 实例介绍 (建议看原著里面有DEMO下载) ...
随机推荐
- java swing文件内容检索工具
Java相关技术 - 文件内容检索工具 拿到一个几百M甚至上G的project让你去学习 有时候你会想知道某个关键词是在哪个文件里 比如:spring MVC配置的@RequestMapping,你从 ...
- [dpdk] 熟悉SDK与初步使用 (二)(skeleton源码分析)
接续前节:[dpdk] 熟悉SDK与初步使用 (一)(qemu搭建实验环境) 程序逻辑: 运行参数: 关键API: 入口函数: int rte_eal_init(int argc, char **ar ...
- crontab 管理指定用户的定时任务
创建用户定时任务文件 touch /var/spool/cron/target_user crontab -u target_user /var/spool/cron/target_user 编辑用户 ...
- Angular-ngtable联动全选
之前于Angular第三方插件ngTable的官网demo上看到的例子,但苦于demo中联动全选为选中所有,项目中并不适用,因此做了下小小的修改,修改目的只是为实现其功能,方法不敢苟同,若有更加简便的 ...
- 关于新版ADT创建项目时出现appcompat_v7的问题
做Android开发的朋友最近会发现,更新ADT至22.6.0版本之后,创建新的安装项目,会出现appcompat_v7的内容.并且是创建一个新的内容就会出现.这到底是怎么回事呢?原来appcompa ...
- 在Ubuntu上安装网易云音乐
对于网易,我只服云音乐,业界良心,用过的人都知道.我最喜欢的就是歌曲的评论功能,还有朋友圈子.里面有很多好段子,还有很多的好故事,基本上,不是分手,就是回忆初恋,还有吐槽的.我认为音乐带给人的不仅是耳 ...
- 79. Word Search
使用的别人的思路,用一个二维数组记录每一个位置是否用过,然后通过递归来判断每一个位置是否符合 public class Solution { public boolean exist(char[][] ...
- MAC emacs下安装php-mode
在某一个个页面(抱歉不记得了), 比较了三个配置,php-mode, php-mode-improved, xnhtml. 作者在比较后推荐xnhtml,但在xnthml官网下载链接一直显示403,真 ...
- 用Apache生产csr申请证书
一. 安装Apache: 1.安装完成后将apache安装目录下 conf 文件夹中的"openssl.cnf"文件复制到bin文件夹中: 2.配置Apache支持ssl: 打开A ...
- SQL,根据不同条件拼接不同SQL,非if拼接 改为SQL where形式
(参数) and 其他条件)