应老师的要求,要做个安卓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. C/C++-左值、右值及引用

    目录 1.左值and右值 2.引用 3.左值引用的用途 4.std::move和std::swap C和C++中定义了引用类型(reference type),存在左值引用(lvalue refere ...

  2. Anaconda使用入门

    简介 Conda是一个开源的包.环境管理器,可以用于在同一个机器上安装不同版本的软件包及其依赖,并能够在不同的环境之间切换 Anaconda包括Conda.Python以及一大堆安装好的工具包,比如: ...

  3. Java面试题-字符串操作

    题目:输入一行字符,分别统计出其中英文字母,空格,数字和其他字符个数 //创建一个容器,用来保存结果,英文字母空格数组和其他字符做key,个数为value Map<String,Integer& ...

  4. delphi保存文件的命名规则

    没有固定的标准.自己可以定义 .你可以参考PASCAL命名法则.查一下PASCAL命名. 我习惯用UMain,FMain,UDM,DM,UAboutBox,AboutBox.....程序相关内容都放在 ...

  5. bootstrap table表格属性、列属性、事件、方法

    留存一份,原文地址http://bootstrap-table.wenzhixin.net.cn/zh-cn/documentation/ 表格参数 表格的参数定义在 jQuery.fn.bootst ...

  6. Mockito中@Mock与@InjectMock

    Mockito是java单元测试中,最常用的mck工具之一,提供了诸多打桩方法和注解.其中有两个比较常用的注解,@Mock和@InjectMock,名字和在代码中使用 的位置都很像,对于初学者,很容易 ...

  7. 记录一发wm_concat()函数排序的问题

    需求:需要将列转行之后的工序按照待执行工序号排序,如果一样按工序号排 解决方法如下: select part_no, max(ywggx) ywggx from(select mt.part_no , ...

  8. 修改firefox默认下载路径

    菜单栏---编辑---首选项--在常规页就可以看到下载设置了

  9. a标签的download属性简介

    最近在工作中需要一个前端直接下载静态文件的需求,之前有粗略的了解过a标签的download属性,通过download和href属性可以实现文件的下载. 简介 HTML <a> 元素 (或锚 ...

  10. oracle查看字符集和修改字符集

    oracle查看字符集和修改字符集 : 查看数据库服务器的字符集: select userenv('language') from dual ; 登陆用dba: 停掉数据库 : shutdown im ...