应老师的要求,要做个安卓app,实现备份app上的数据到服务器上的mongodb上,网上搜了下相关的实现方式。利用webservice技术,具体来说就是客户端直接调用服务器端的接口。之前从来没接触这玩意儿,网上搜了个初学者入门的demo:Java WebService 简单实例。用myecipse写了服务器端的webservice:

 package com.hyan.service;
import javax.jws.WebService;
import javax.xml.ws.Endpoint; import org.bson.BsonDocument;
import org.bson.Document; import com.mongodb.DB;
import com.mongodb.DBCollection;
import com.mongodb.DBObject;
import com.mongodb.MongoClient;
import com.mongodb.client.MongoCollection;
import com.mongodb.client.MongoDatabase;
import com.mongodb.util.JSON; @WebService
public class ServiceHello { /**
* 供客户端调用的方法
* @param name 传入参数
* @param name 返回结果
*/
public String getValue(String table,String items){
/*连接到mongodb进行curd操作*/
try{
MongoClient mongoClient = new MongoClient( "localhost" , 27017 );
DB db = MongoDB shell("tagmanager");
DBCollection collection = db.getCollection(table);
DBObject dbObject = (DBObject)JSON.parse(items);
collection.insert(dbObject);
System.out.println("插入成功!!!");
}catch(Exception e){
e.printStackTrace();
return "fail";
}
return "success";
}
public static void main(String[] args) {
Endpoint.publish("http://localhost:9001/Service/ServiceHello?wsdl",new ServiceHello());
System.out.println("service success!");
} }

这里有个小插曲,我本来打算是将安卓应用上的数据取出来,拼成json字符串再传到webservice中的方法中,再插入到mongodb中,结果按照www.runoob.com的mongodb教程发现只能插入Document类型,只能一个key-value一个key-value这样的去添,这样太烦了吧?难道就不能直接插入个json字符串么?我用MongoDB shell插入数据都直接是一条json字符串插入的啊,后来又搜了下,能通过上面的代码实现这个功能,只不过getDB()这个方法过时了,mongodb官方不推荐用这个方法.....,过时就过时吧,我也找不到其它的方法了。如果哪位有其它方法的话请务必告知,小弟谢谢了!!!

下面就是安卓应用端该怎么写了,这里参考了http://www.cnblogs.com/superpang/p/4911422.html篇和http://blog.csdn.net/mfc2003/article/details/17119135这篇博客

写好安卓端后和myecipse的客户端后,测试发现用电脑Myeclipse客户端可以访问webservice但是安卓端却无法通过内网ip地址访问我电脑上的webservice百度了下还是没有解决问题,改变策略,去nat123申请了个二级域名用外网到内网这种形式来让我手机访问到我电脑上的webservice,搞定!

eclise安卓端的代码:

 package com.example.tagmanager.util;

 import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.HttpTransportSE; import com.example.tagmanager.db.SqliteDBHelper; import android.app.ProgressDialog;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.AsyncTask;
import android.util.Log;
import android.widget.Toast; /*Android多线程编程,异步消息处理机制,使用AsycTask*/
public class BackUpByAsync extends AsyncTask<Context, Context, Boolean>{ private SqliteDBHelper dbHelper = new SqliteDBHelper(
MyApplication.getContext(), "TagManager.db", null, 1);
private SQLiteDatabase db = dbHelper.getWritableDatabase();
private ProgressDialog progressDialog;
private Boolean flag = true; @Override
protected void onProgressUpdate(Context... values) {
progressDialog=new ProgressDialog(values[0]);
progressDialog.setTitle("提示");
progressDialog.setMessage("数据备份中...");
progressDialog.show();
} @Override
protected Boolean doInBackground(Context... arg0) {
String namespace = "http://service.hyan.com/";
String methodName = "getValue";
String WSDL_URI = "http://100702b5.nat123.cc:38965/Service/ServiceHello?wsdl"; Cursor cursor;
publishProgress(arg0);
/* 备份通讯录 */
cursor = db.query("Contact", null, null, null, null, null, null);
if (cursor.moveToFirst()) {
do {
String name = cursor.getString(cursor.getColumnIndex("name"));
String telephone = cursor.getString(cursor
.getColumnIndex("telephone"));
String contact = "{\"name\":" + "\"" + name + "\"" + ","
+ "\"telephone\":" + "\"" + telephone + "\"}";
Log.d("debug", contact);
SoapObject request = new SoapObject(namespace, methodName);
request.addProperty("arg0", "contact");
request.addProperty("arg1", contact);
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
SoapSerializationEnvelope.VER11);
envelope.setOutputSoapObject(request);
envelope.bodyOut = request;
envelope.dotNet = false;
HttpTransportSE ht = new HttpTransportSE(WSDL_URI); try {
Log.d("debug", "调用webservice中.........");
ht.call(null, envelope);
// 获取返回的数据
SoapObject object = (SoapObject) envelope.bodyIn;
// 获取返回的结果
String result = object.getProperty(0).toString();
Log.d("debug", result);
} catch (Exception e) {
e.printStackTrace();
flag = false;
}
} while (cursor.moveToNext());
}
cursor.close();
@Override
protected void onPostExecute(Boolean result) {
progressDialog.dismiss();
if(flag){
Toast.makeText(MyApplication.getContext(), "备份成功", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(MyApplication.getContext(), "备份失败", Toast.LENGTH_SHORT).show();
}
} }

不过还是没搞明白为什么webservice局域网无法访问....

Android局域网访问webservice以及其中的一些问题的更多相关文章

  1. Android访问WebService的两种方法

    首先解释一下WebService:WebService是一种基于SOAP协议的远程调用标准.通过WebService可以将不同操作系统平台,不同语言.不同技术整合到一起.详细见:http://baik ...

  2. WebService---Android中访问WebService接口的方法

     最近公司有个项目需要从Android平台访问WebService接口,实现向发布的函数传递对象.在网上找了一些资料,发现使用ksoap2可以调用WebService传递对象.   需要引入ksoap ...

  3. Android实现KSOAP2访问WebService

    Android实现KSOAP2访问WebService 开发工具:Andorid Studio 1.3 运行环境:Android 4.4 KitKat 代码实现 写一个工具类来给主界面使用,作用是使用 ...

  4. 如何解析android访问webservice返回的SoapObject数据(可用)

    怎么解析android访问webservice返回的SoapObject数据 本帖最后由 kkDragon123 于 2013-03-26 15:50:07 编辑 我的数据如下:mingdanResp ...

  5. (转)Android访问webservice

    纠正网上乱传的android调用Webservice方法.   1.写作背景: 笔者想实现android调用webservice,可是网上全是不管对与错乱转载的文章,结果不但不能解决问题,只会让人心烦 ...

  6. 在Android中调用WebService

    某些情况下我们可能需要与Mysql或者Oracle数据库进行数据交互,有些朋友的第一反应就是直接在Android中加载驱动然后进行数据的增删改查.我个人不推荐这种做法,一是手机毕竟不是电脑,操作大量数 ...

  7. 从零开始学android开发-通过WebService进行网络编程,使用工具类轻松实现

    相信大家在平常的开发中,对网络的操作用到HTTP协议比较多,通过我们使用Get或者Post的方法调用一个数据接口,然后服务器给我们返回JSON格式的数据,我们解析JSON数据然后展现给用户,相信很多人 ...

  8. Android Permission 访问权限大全(转)

    程序执行需要读取到安全敏感项必需在androidmanifest.xml中声明相关权限请求, 完整列表如下: android.permission.ACCESS_CHECKIN_PROPERTIES允 ...

  9. Android存储访问及目录

    Android存储访问及目录 Android的外部存储 Android支持外部存储(case-insensitive filesystem with immutable POSIX permissio ...

随机推荐

  1. P2P(WFD)之RegClass *****************************TBD

    三个Action Frame的IE会有带上RegClass的信息 Listen Channel element, Channel List element, Operation Channel ele ...

  2. Javascript中闭包常用场景

    一.前言 有准备去看Javascript框架,所以对于Javascript和原型继承有必要去了解,这边小记一下闭包比较好的例子~ 二.正文 先来一下“闭包”的解释~ 一个拥有许多变量和绑定了这些变量的 ...

  3. Oracle锁表查询以及解锁

    一.查看锁表进程SQL语句 select sess.sid, sess.serial#, lo.oracle_username, lo.os_user_name, ao.object_name, lo ...

  4. hdu 3500 Fling (dfs)

    Fling Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Submi ...

  5. [Leetcode] Merge k sorted lists 合并k个已排序的链表

    Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 思 ...

  6. [zhuan]Android安全讲座第九层(二) 内存dump

    http://sunzeduo.blog.51cto.com/2758509/1409450 近来android上越来越多的应用对自身的保护机制加强了重视,主要表现在几个方面. 1 dex加壳 2 s ...

  7. ubuntu下opencv使用cvNamedWindow()和cvShowImage()出错的解决方法

    重装系统和opencv,编译运行显示一副图像的程序,报错如下 liurf@liurf-Lenovo-G470:~/WorkSpace/slambook-master/ch5/imageBasics$ ...

  8. git学习,哇瑟说实话我想要的

    1.Git 简介及安装Git是目前世界上最先进的分布式版本控制系统(没有之一).它的诞生也颇具传奇,Linux创始人Linus花了两周时间自己用C写了一个分布式版本控制系统,这就是Git!有兴趣的话, ...

  9. docker公司测试环境搭建总结

    1.防火墙转发规则: [root@docker ~]# firewall-cmd --list-allpublic (active) target: default icmp-block-invers ...

  10. hadoop 架构