应老师的要求,要做个安卓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. 3GPP规范命名规则解读

    http://blog.sina.com.cn/s/blog_6b10255301012co6.html 学习了解电信技术知识的一个很好的手段是阅读3GPP的规范.但是3GPP有大量的规范,我们可能经 ...

  2. POI读取带有公式的Excel单元格-xssf

    if(CellType.FORMULA == row.getCell(j).getCellTypeEnum()) { try { cellValue = String.valueOf(row.getC ...

  3. 基于C#的PISDK研究(理论)

    本篇文章主要对PISDK体系结构以及重点类进行阐述. 当我们决定使用PISDK时,可能会使用到下面的类库: 在上表中,PISDK.dll为核心类,大部分主要功能都在该类中.PISDKCommon.dl ...

  4. Java集合整体框架

    Java中的集合类有List.Set.Map Collection的实现类:List.Set List的实现类:ArrayList.LinkedList.Vector Set的实现类:HashSet. ...

  5. Struts2监听Action结果的监听器

    作者:禅楼望月 在前面我们学到了在特定的Action中配置结果监听器,在Action完成控制处理之后,struts2转入实际的物理视图之前被回调.但是这种方式的缺点是,结果的监听器不能被复用.根据设计 ...

  6. springMVC笔记一

    第一章 回顾JavaWeb中的MVC设计模式 1)MVC这种设计模式,不光运用于Web领域,而且也能用于非Web领域 2)今天说的MVC特指一种表现层设计模式,不限于Java语言 第二章 回顾stru ...

  7. 算法学习——kruskal重构树

    kruskal重构树是一个比较冷门的数据结构. 其实可以看做一种最小生成树的表现形式. 在普通的kruskal中,如果一条边连接了在2个不同集合中的点的话,我们将合并这2个点所在集合. 而在krusk ...

  8. 关于Maven项目install时出现No compiler is provided in this environment的处理

    关于Maven项目build时出现No compiler is provided in this environment的处理 新配置的Eclipse环境,运行现有项目没问题,一日,从svn上检出了一 ...

  9. 在Global.asax中过滤POST请求的非法参数。

    using System;using System.Collections.Generic;using System.Collections.Specialized;using System.Linq ...

  10. VC++中编译C出错:error C2143: syntax error : missing ';' before 'type'

    转摘自:http://preceo.blog.51cto.com/6225017/1130931 近来写程序时发现了一个问题,用 VC 编译 C语言是 总是提示一个错误:error C2143: sy ...