精华内容
下载资源
问答
  • 安卓asp服务器
    千次阅读
    2022-03-02 10:25:36

    荣耀3c,安卓版本4.4,因为版本太低,不可以安装Termux,只能安装LinuxDeploy(2.3就行,2.6不支持安卓4.4)。

    网上很多方案都是Termux,但那东西要求安卓7,安卓7都算旧手机了,那安卓4只能算垃圾了吧。

    好吧,垃圾也是要利用的。

    安装LinuxDeploy的前提是手机可root,手机root的前提是无BL锁。

    安装时选择Debian 9系统(不能选择CentOS,因为CentOS下的mono只支持x86_64和i686,而手机属于armhf(32位)或 arm64)。

    LinuxDeploy的用法自行百度。

    mono到这个页面去看

    https://www.mono-project.com/download/stable/#download-lin-debian

    nginx要在控制台里用sudo apt-get install nginx安装

    mono和nginx的版本都不太高,mono只支持到asp.net 4.0,够用了。

    然后就是按照常规方式配置,配合内网穿透的话,一个低功耗小服务器就诞生了。

    如果使用ngrok.cc提供的内网穿透,一个月才10块钱,ssh照样飞起,可比租vpn香多了。

    更多相关内容
  • 要实现一个功能,就是需要通过发送短信进行注册,现在想把短信验证码放到服务器的session值中,当客户端收到短信并提交短信码时由asp.net服务端进行判断,那么如何共享这个session那么需要在android客户端中添加几行...

    前言

    最近因为工作的需要,要实现一个功能,就是需要通过发送短信进行注册,现在想把短信验证码放到服务器的session值中,当客户端收到短信并提交短信码时由asp.net服务端进行判断,那么如何共享这个session那么需要在android客户端中添加几行代码。

    实现方法

    如下操作。第一次数据请求时就获取这个cookie的名称并且得到这个cookie的值,这个即是sessionid的值并保存在一个静态变量中,然后在第二次请求数据的时候要将这个sessionid一并放在Cookie中发给服务器,服务器则是通过这个sessionid来识别究竟是那个客户端在请求数据的,在asp.net中这个sessionid的名字叫做ASP.NET_SessionId,当然我们可以从程序中获取。

    如下代码:

    //获取服务端的这个sessionid的名称

    /* 获取cookieStore */

    List cookies = cookieStore.getCookies();

    for(int i=0;i

    String sessionid = cookies.get(i).getName(); 从这里可以获取到这个sessionid,即为 ASP.NET_SessionId

    }

    获取sessionid的值

    for(int i=0;i

    if("ASP.NET_SessionId".equals(cookies.get(i).getName())){

    JSESSIONID = cookies.get(i).getValue(); //这个即为sessionid的值

    break;

    }

    }

    完整的httputils代码如下:

    public static DefaultHttpClient httpClient = null;

    private static String JSESSIONID; //定义一个静态的字段,保存sessionID

    public static String getRequest(String url)

    {

    httpClient = new DefaultHttpClient();

    HttpGet get = new HttpGet(url);

    try

    {

    HttpParams params = new BasicHttpParams();

    HttpConnectionParams.setConnectionTimeout(params, 10000);//设置连接超时

    HttpConnectionParams.setSoTimeout(params, 15000);//设置请求超时

    get.setParams(params);

    get.setHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");

    if(null != JSESSIONID){

    get.setHeader("Cookie", "ASP.NET_SessionId="+JSESSIONID);

    }

    //连接响应,通过HttpResponse获得响应信息

    HttpResponse httpResponse = httpClient.execute(get);

    if(httpResponse.getStatusLine().getStatusCode() == 200)

    {

    //取得响应字符串

    String result = EntityUtils.toString(httpResponse.getEntity());

    return result;

    }

    }

    catch (ClientProtocolException e)

    {

    return null;

    }

    catch (IOException e)

    {

    return null;

    }

    return null;

    }

    public static String postRequest(String url, HashMap rawParams) throws Exception

    {

    httpClient = new DefaultHttpClient();

    //创建POST请求方式

    HttpPost post = new HttpPost(url);

    HttpParams cparams = new BasicHttpParams();

    HttpConnectionParams.setConnectionTimeout(cparams, 10000);//设置连接超时

    HttpConnectionParams.setSoTimeout(cparams, 15000);//设置请求超时

    post.setParams(cparams);

    post.setHeader("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");

    if(null != JSESSIONID){

    post.setHeader("Cookie", "ASP.NET_SessionId="+JSESSIONID);

    }

    //使用NameValuePair来保存要传递的参数,可以使用BasicNameValuePair来构造一个要被传递的参数

    //通过add添加这个参数到NameValuePair中

    ArrayList params = new ArrayList();

    for(String key : rawParams.keySet())

    {

    //添加要传传递的参数

    params.add(new BasicNameValuePair(key, rawParams.get(key)));

    }

    //post需要为参数设置字符集

    HttpEntity httpEntity = new UrlEncodedFormEntity(params, HTTP.UTF_8);

    //请求httpRequest

    post.setEntity(httpEntity);

    //发送POST请求并获取响应

    HttpResponse httpResponse = null;

    try

    {

    httpResponse = httpClient.execute(post);

    }

    catch(Exception ex)

    {

    String ee = ex.getMessage();

    }

    if(httpResponse.getStatusLine().getStatusCode() == 200)

    {

    String result = EntityUtils.toString(httpResponse.getEntity(), HTTP.UTF_8);

    /* 获取cookieStore

    ASP.NET_SessionId就是通过上面的方法获取到。

    */

    CookieStore cookieStore = httpClient.getCookieStore();

    List cookies = cookieStore.getCookies();

    for(int i=0;i

    if("ASP.NET_SessionId".equals(cookies.get(i).getName())){

    JSESSIONID = cookies.get(i).getValue();

    break;

    }

    }

    return result;

    }

    return null;

    }

    cbb3acbcd608a2024053c86defc4f963.png

    c815ce904bf75eb46435704fb5f66a45.png

    总结

    以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

    展开全文
  • Android端将小文件上传到asp.net服务器
  • 下面说一下Android如何通过asp.net向服务器提交数据,我们此问题分成两块,第一块是asp.net,第二块是Android app。  asp.net:  1.首先Visual Studio打开或新建一个asp.net网站  2.在解决方案资源管理器窗口中...

    下面说一下Android如何通过asp.net向服务器提交数据,我们此问题分成两块,第一块是asp.net,第二块是Android app。
      asp.net:
      1.首先Visual Studio打开或新建一个asp.net网站
       2.在解决方案资源管理器窗口中的网站节点右键添加新项,选择Web服务(图1),取名,这样就生成了一个asmx页面,可以看到系统自动生成了一个HelloWorld的字符串方法,将asmx页面设为起始页,运行,可以看到(图2)有一个HelloWorld链接,点击就可以看到它的输出内容。
      3.关闭asmx页面,我们自己写一个简单的方法,比如输出一个两数相加的方法。再次运行,可以看到asmx页面多了一个Add方法,点击,输入相应参数,就得到了两数相加的结果。

    [WebMethod]
        public int Add(int a, int b)
        {
            return a + b;
        }
    

    Android app
      1.用Android studio或eclipse打开或新建一个项目。
      2.在AndroidManifest.xml添加网络权限。权限如下

      <!-- 查看网络状态 -->
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
        <!-- 互联网 -->
        <uses-permission android:name="android.permission.INTERNET" />

    3.在布局文件中添加一个TextView用于显示处理结果(代码略)。
      4.引入一个ksoap2的第三方jar包。一会我们需要通过它来实现对接刚才建立的asp.net网站(Web Api).
      5.建立一个”种子类“,代码如下

    public class SoapObject_Property
    {
        public String PropertyName="";
        public Object PropertyValue=null;
    
        public SoapObject_Property()
        {
            this.PropertyName="";
            this.PropertyValue=null;
        }
    
    
    }
    

    6.建立一个”Util类“,代码如下:

    public class AsmxUtil
    {
        public String url="";
        private boolean issuccess=true;
    
        public AsmxUtil(String url)
        {
            this.url=url;
    
        }
    
        public AsmxUtil()
        {
            
        }
    
        public String GetasmxConent(String methodname, ArrayList<SoapObject_Property> ArrSOOP)
        {
            final String servicens="http://tempuri.org/";
            final String soapaction="http://tempuri.org/"+methodname;
            String outresult="";
            //http://localhost/swaddle/SwaddleVideoService.asmx
            //创建HttpTransportSE传输对象,该对象用于调用Web Service操作
            final HttpTransportSE ht = new HttpTransportSE(url);
            ht.debug = true;
            //使用SOAP1.1协议创建Envelop对象。从名称上来看,SoapSerializationEnvelope代表一个SOAP消息封包;但ksoap2-android项目对
            //SoapSerializationEnvelope的处理比较特殊,它是HttpTransportSE调用Web Service时信息的载体--客户端需要传入的参数,需要通过
            //SoapSerializationEnvelope对象的bodyOut属性传给服务器;服务器响应生成的SOAP消息也通过该对象的bodyIn属性来获取。
            final SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
            //实例化SoapObject对象,创建该对象时需要传入所要调用的Web Service的命名空间、Web Service方法名
            SoapObject soapObject = new SoapObject(servicens, methodname);
            //---
            if (ArrSOOP!=null || ArrSOOP.size()>0)
            {
                for (int i=0;i<ArrSOOP.size();i++)
                {
                    SoapObject_Property SOOPItem=ArrSOOP.get(i);
                    String PropertyName=SOOPItem.PropertyName;
                    Object PropertyValue=(String.valueOf(SOOPItem.PropertyValue)) ;
                    soapObject.addProperty(PropertyName, PropertyValue);
                }
            }
    //        soapObject.addProperty("a", 10);
    //        soapObject.addProperty("b", 12);
    
            //---
            //对dotnet webservice协议的支持,如果dotnet的webservice
            envelope.dotNet = true;
            //调用SoapSerializationEnvelope的setOutputSoapObject()方法,或者直接对bodyOut属性赋值,将前两步创建的SoapObject对象设为
            //SoapSerializationEnvelope的付出SOAP消息体
            envelope.bodyOut = soapObject;
    
            try
            {
                //调用WebService,调用对象的call()方法,并以SoapSerializationEnvelope作为参数调用远程Web Service
                ht.call(soapaction, envelope);
                if(envelope.getResponse() != null)
                {
                    //获取服务器响应返回的SOAP消息,调用完成后,访问SoapSerializationEnvelope对象的bodyIn属性,该属性返回一个
                    //SoapObject对象,该对象就代表了Web Service的返回消息。解析该SoapObject对象,即可获取调用Web Service的返回值
                    SoapObject so = (SoapObject) envelope.bodyIn;
                    //接下来就是从SoapObject对象中解析响应数据的过程了
                    outresult = so.getPropertyAsString(0);
                    issuccess=true;
    
                }
                else
                {
                    outresult="";
                    issuccess=false;
                }
            }
            catch (Exception e) {
                outresult=e.toString();
                issuccess=false;
                e.printStackTrace();
            }
    
    
            return  outresult;
        }
    
        public boolean IsSuccess()
        {
            return  issuccess;
        }
    }
    

    5.在布局文件对应Activity类中添加一个广播接收类一个线程类,早在安卓2.3时,谷歌就默认在主线程中不能直接调用诸如网络访问等耗时操作(会引发异常),尽管可以通过以下方法,来强制"关闭限制",但这并不是推荐的方法,规范的方法就是通过线程来操作。
    if (android.os.Build.VERSION.SDK_INT > 9) {
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
    StrictMode.setThreadPolicy(policy);
    }
      “规范“代码如下。这里有几个需要注意的地方。一是PropertyName必须与asp.net中对应的参数名大小写一致。二是,我们在调试时通常程序与服务器在同一电脑上,也是就是本地,如果是windows程序或上面的asp.net网站,地址是localhost或127.0.0.1,但到了AS或eclipse自带AVD模拟器,localhost、127.0.0.1两个地址会被认为是模拟器本身,所以这里的ip段统一要用10.0.2.2来替代,三是,我添加了等待对话框,因为在耗时操作时,我们需要告知用户等待,并且等待时间不允许再新进行新的操作直至耗时操作完成。关于耗时对话框可以查看我的另一篇博文。https://blog.csdn.net/wstcl/article/details/120403362?spm=1001.2014.3001.5501

    public class Page2Activity extends AppCompatActivity {
    
        private TextView tv;
        private final String tipfilter="tip";
        private final String donefilter="done";
        private TipBroadcast tipBroadcast;
        private BroadCastDone broadcastdone;
        private WaitDialog waitDialog;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_page2);
            tv=findViewById(R.id.TV);
    //
            waitDialog=new WaitDialog(this);
            waitDialog.show();
            new ConnAspNetThread(this).start();
        }
    
        private void registerdonebroadcast()
        {
            broadcastdone = new BroadCastDone();  //即时广播
            // 创建一个意图过滤器,只处理指定事件来源的广播
            IntentFilter filter = new IntentFilter(donefilter);
            // 注册广播接收器,注册之后才能正常接收广播
            LocalBroadcastManager.getInstance(this).registerReceiver(broadcastdone, filter);
        }
    
        private void SendTipBroadcast(String tip,int op)
        {
            Intent intent = new Intent(tipfilter);
            intent.putExtra("Tip", tip);
            intent.putExtra("Op",op);
    
            // 通过本地的广播管理器来发送广播
    
            LocalBroadcastManager.getInstance(this).sendBroadcast(intent);//发送广播
        }
    
        private class ConnAspNetThread extends Thread
        {
    
            private Context context;
            public ConnAspNetThread(Context context)
            {
                this.context=context;
            }
            @Override
            public  void run()
            {
                registerdonebroadcast();
                ArrayList<SoapObject_Property> ArrSOOP=new ArrayList<SoapObject_Property>();
                SoapObject_Property SOOPa=new SoapObject_Property();
                SOOPa.PropertyName="a";
                SOOPa.PropertyValue=100;
    
                SoapObject_Property SOOPb=new SoapObject_Property();
                SOOPb.PropertyName="b";
                SOOPb.PropertyValue=44;
    
                ArrSOOP.add(SOOPa);
                ArrSOOP.add(SOOPb);
    
                try
                {
                    AsmxUtil asmxUtil=new AsmxUtil("http://10.0.2.2:32262/WebSite2/TestWS.asmx");
                    String s=asmxUtil.GetasmxConent("Add",ArrSOOP);
    
                    if (asmxUtil.IsSuccess())
                    {
                        SendTipBroadcast(s,1);
    
                    }
                    else
                    {
                        SendTipBroadcast(s,0);
    
                    }
                    //Thread.sleep(5000);
                }
    
                catch (Exception e)
                {
                    SendTipBroadcast(e.toString(),0);
                }
                Intent intent = new Intent(donefilter);
    
    
                // 通过本地的广播管理器来发送广播
    
                LocalBroadcastManager.getInstance(context).sendBroadcast(intent);//发送广播
            }
    
    
        }
    
        @Override
        public void onStart() {
            super.onStart();
    
            tipBroadcast = new TipBroadcast(this);  //即时广播
            // 创建一个意图过滤器,只处理指定事件来源的广播
            IntentFilter filter = new IntentFilter(tipfilter);
            // 注册广播接收器,注册之后才能正常接收广播
            LocalBroadcastManager.getInstance(this).registerReceiver(tipBroadcast, filter);
    
        }
    
        @Override
        public void onStop() {
            super.onStop();
            // 注销广播接收器,注销之后就不再接收广播
            LocalBroadcastManager.getInstance(this).unregisterReceiver(tipBroadcast);
    
        }
    
        private class TipBroadcast extends BroadcastReceiver  //定义一个提示广播
        {
    
            Context context;
            public TipBroadcast(Context context)
            {
                this.context=context;
            }
            @Override
            public void onReceive(Context context, Intent intent)
            {
                if (intent != null) {
    
    
                    String tip=intent.getStringExtra("Tip");//解包
                    int op=intent.getIntExtra("Op",0);
    
    
                    switch (op)
                    {
                        case 0:
                            tv.setText(tip);
                            Toast.makeText(context,tip,Toast.LENGTH_SHORT).show();
    
                            break;
                        case 1:
                            tv.setText(tip);
    
                            break;
                    }
    
                    //Toast.makeText不能写在线程内,所以只能用广播
                }
            }
        }
        private class BroadCastDone extends BroadcastReceiver
        {
    
            @Override
            public void onReceive(Context context, Intent intent)
            {
                if (intent != null)
                {
                    waitDialog.dismiss(); //关闭对话框
    
                }
            }
        }
    }
    

    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • android手机与asp服务器传输数据源码

    热门讨论 2014-06-17 11:39:09
    1.服务器端为ASP+Access2003+IIS 2.移动端为Android 3.移动端将内容提交Request给服务器端 4.代码完整可以运行
  • 文件提供android端和web端。。。android端提供两种上传方式,web端提供两种接收方式,一种为aspx文件和web服务方式(asmx),android:xUtils三方工具,和自带的上传方式。。。xUtils方式解决了某些手机在上传照片...
  • 下面开始第三讲,通过asp.net ...通过asp.net api来访问sql server数据库要比第一讲直接连接复杂,便强烈建议使用此种方法,原因也在第一讲中说明了。好了,下面上步骤与代码。  因为第一讲中已经实现了数据库部份,因

    下面开始第三讲,通过asp.net api来访问sql server数据库,在阅读本节之前,您应该先阅读第一讲的文章https://blog.csdn.net/wstcl/article/details/125081398?spm=1001.2014.3001.5502,本节与第二讲没有联系,因此您可以越过第二讲,通过asp.net api来访问sql server数据库要比第一讲直接连接复杂,便强烈建议使用此种方法,原因也在第一讲中说明了。好了,下面上步骤与代码。
      因为第一讲中已经实现了数据库部份,因此此节直接便从asp.net端和安卓端来讲解。
      先来讲asp.net端,先前我写过一篇安卓app通过asp.net访问服务器 https://blog.csdn.net/wstcl/article/details/120458183?spm=1001.2014.3001.5501,里面通过在api端实现一个简单两个整数相加求和,然后安卓获得求和结果,因此你也可以先阅读此文,如此再来阅读本文,本文就会显得更易理解一些。好了,回到正题,实现代码
      1.新建或打开一个asp.net网站
      2.在解决方案管理器窗口打开web.config,配置数据库连接

     <add name="WebSite" connectionString="Data Source=localhost;Initial Catalog=dbtest;User ID=sa;Password=123"/>
    

    3.在解决方案管理器窗口打开Global.asax,在Application_Start方法中赋值数据库连接 Application[“ConnectString”] = ConfigurationManager.ConnectionStrings[“WebSite”].ConnectionString;
      4…在解决方案管理器窗口右键添加引用,这里要引入一个叫Newtonsoft.Json的类库,一会要用它来打包json。
      5.在解决方案管理器窗口的网站节点下右键"添加新项",新建一个类,,名称与表名对应,即Product,代码如下

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    
    /// <summary>
    ///Product 的摘要说明
    /// </summary>
    public class Product
    {
        public bool IsCorrect;
        public string LastError;
        public List<XProduct> ArrXProduct;
        
        public Product()
    	{
    		//
    		//TODO: 在此处添加构造函数逻辑
    		//
    
    
    	}
    }
    
    public class XProduct
    {
        //与字段对应
        public int Id = 0;
        public String Name = "";
        public int Num = 0;
    
    }
    

    6.在解决方案管理器窗口的网站节点下右键"添加新项",在弹出的窗口中选择Web服务,如图1,这时树型目录中多出了一个asmx文件,同时在App_Code多了一个对应的cs文件,打开它,里面一个自动生成的helloworld的方法,可以删除它,然后写入我们自己需要的代码,代码如下

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Services;
    using System.Data;
    using System.Data.SqlClient;
    
    using Newtonsoft.Json;
    
    /// <summary>
    ///WebSqlService 的摘要说明
    /// </summary>
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    //若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。 
    // [System.Web.Script.Services.ScriptService]
    public class WebSqlService : System.Web.Services.WebService {
    
        
    
        public WebSqlService () {
    
            //如果使用设计的组件,请取消注释以下行 
            //InitializeComponent(); 
           
        }
    
      
    
    
        [WebMethod]
        public String Add(String Name,int Num)
        {
            String result = "";
            SqlConnection conn;
    
            conn = new SqlConnection(Application["ConnectString"].ToString());
            try
            {
                conn.Open();
                SqlCommand cmd = new SqlCommand("p_my_ProductAdd", conn);
                cmd.CommandType = CommandType.StoredProcedure;
                SqlParameter RETURN_VALUEParam = cmd.Parameters.Add("@RETURN_VALUE", SqlDbType.Int, 4);
                RETURN_VALUEParam.Direction = ParameterDirection.ReturnValue;
    
                SqlParameter NameParam = cmd.Parameters.Add("@Name", SqlDbType.VarChar, 50);
                NameParam.Value = Name;
    
                SqlParameter NumParam = cmd.Parameters.Add("@Num", SqlDbType.Int);
                NumParam.Value = Num;
    
                cmd.ExecuteNonQuery();
                cmd.Dispose();
                result ="添加成功";
            }
            catch (SqlException ex)
            {
    
                result = ex.Message;
            }
            catch (System.Exception ex)
            {
                result = ex.Message;
                
            }
            finally
            {
                conn.Close();
            }
            
            
            return result;
        }
    
        [WebMethod]
        public String List()
        {
            SqlConnection conn;
            SqlDataReader dr = null;
            String result = "";
    
    
            conn = new SqlConnection(Application["ConnectString"].ToString());
            List<XProduct> ArrXProduct = new List<XProduct>();
            Product MyProduct = new Product();
            try
            {
                conn.Open();
                SqlCommand cmd = new SqlCommand("p_my_ProductList", conn);
                cmd.CommandType = CommandType.StoredProcedure;
                SqlParameter RETURN_VALUEParam = cmd.Parameters.Add("@RETURN_VALUE", SqlDbType.Int, 4);
                RETURN_VALUEParam.Direction = ParameterDirection.ReturnValue;
    
                MyProduct.LastError = "";
                MyProduct.IsCorrect = true;
                dr = cmd.ExecuteReader();
                while (dr.Read())
                {
    
                    XProduct MyXProduct = new XProduct();
    
                    MyXProduct.Id = int.Parse(dr["Id"].ToString());
    
                    MyXProduct.Name = dr["Name"].ToString();
    
                    MyXProduct.Num = int.Parse(dr["Num"].ToString());
    
                    ArrXProduct.Add(MyXProduct);
                }
                MyProduct.ArrXProduct = ArrXProduct;
                dr.Close();
                cmd.Dispose();
            }
            catch (SqlException ex)
            {
                MyProduct.IsCorrect = false;
                MyProduct.LastError = ex.Message;
                ArrXProduct.Clear();
                MyProduct.ArrXProduct = ArrXProduct;
    
                
            }
            catch (System.Exception ex)
            {
                MyProduct.IsCorrect = false;
                MyProduct.LastError = ex.Message;
                ArrXProduct.Clear();
                MyProduct.ArrXProduct = ArrXProduct;
    
               
            }
            finally
            {
                conn.Close();
            }
    
            result = JsonConvert.SerializeObject(MyProduct); //将列表及是否正确等信息以JSON格式输出
            return result;
        }
        
    }
    

    7.将asmx设为起初页,运行网站,发现在网页上出现了两个方法Add、List的链接,也就是我们在上一步中添加的两个方法,我们可以通过点击来测试正确性,比如List(我们可以先在数据库中填入一些数据),可以发现,一串json的字符串,如图2,该字符串包含以下信息,IsCorrect为true表明数据库调用正确,此时LastError应该是空字符串,最后ArrXProduct是个数组,里面便一条条表中记录,如果,IsCorrect为False,表明数据库调用错误,此时LastError会输出异常信息,而ArrXProduct应该是一个空的字符串。
      至此,我们完成了asp.net端的代码,接着我们实现安卓端代码。
      1.用android studio新建或打开一个安卓项目。
      2.引入第三方jar包,ksoap2-android-assembly-3.6.0-jar-with-dependencies.jar,它用于连接asp.net。
      3.新建一个包名Bean,用于存放“种子类”。一个与表名相应的类Product,代码如下

    public class Product
    {
        public int Id;
        public String Name;
        public int Num;
    }
    

    然后放一个调用asp.net的种子类,它是调用asp.net的属性。
      4.新建一个Util,用于存放“功能类”。在里面放两个类,第一个ConnectUtil,用存放连接asp.net网站的地址。代码如下

    public class ConnectUtil
    {
        public static final String WebUrl="http://10.0.2.2:9707/WebSite3/";
    }
    

    第二个AsmxUtil,我封装了调用asp.net的方法,代码如下
    import android.util.Log;

    import com.example.sqlserver_byaspnet.Bean.SoapObject_Property;
    
    import org.ksoap2.SoapEnvelope;
    import org.ksoap2.serialization.SoapObject;
    import org.ksoap2.serialization.SoapSerializationEnvelope;
    import org.ksoap2.transport.HttpTransportSE;
    
    import java.util.ArrayList;
    
    public class AsmxUtil
    {
        public String url="";
        private boolean iscorrect=true;
    
        private final String TAG="AsmxUtil";
    
    
        public AsmxUtil(String url)
        {
            this.url=url;
    
        }
    
        public AsmxUtil()
        {
    
        }
    
        public String GetasmxConent(String methodname, ArrayList<SoapObject_Property> ArrSOOP)
        {
            final String servicens="http://tempuri.org/";
            final String soapaction="http://tempuri.org/"+methodname;
            String outresult="";
            //http://localhost/swaddle/SwaddleVideoService.asmx
            //创建HttpTransportSE传输对象,该对象用于调用Web Service操作
            final HttpTransportSE ht = new HttpTransportSE(url);
            ht.debug = true;
            //使用SOAP1.1协议创建Envelop对象。从名称上来看,SoapSerializationEnvelope代表一个SOAP消息封包;但ksoap2-android项目对
            //SoapSerializationEnvelope的处理比较特殊,它是HttpTransportSE调用Web Service时信息的载体--客户端需要传入的参数,需要通过
            //SoapSerializationEnvelope对象的bodyOut属性传给服务器;服务器响应生成的SOAP消息也通过该对象的bodyIn属性来获取。
            final SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
            //实例化SoapObject对象,创建该对象时需要传入所要调用的Web Service的命名空间、Web Service方法名
            SoapObject soapObject = new SoapObject(servicens, methodname);
            //---
            if (ArrSOOP!=null || ArrSOOP.size()>0)
            {
                for (int i=0;i<ArrSOOP.size();i++)
                {
                    SoapObject_Property SOOPItem=ArrSOOP.get(i);
                    String PropertyName=SOOPItem.PropertyName;
                    Object PropertyValue=SOOPItem.PropertyValue ;
                    Log.v(TAG,CommonUtil.getDataType(SOOPItem.PropertyValue)) ;
                    soapObject.addProperty(PropertyName, PropertyValue);
    //                switch ( CommonUtil.getDataType(SOOPItem.PropertyValue))
    //                {
    //
    //
    //                    default:
    //
    //                        break;
    //                }
    
                }
            }
    //        soapObject.addProperty("a", 10);
    //        soapObject.addProperty("b", 12);
    
            //---
            //对dotnet webservice协议的支持,如果dotnet的webservice
            envelope.dotNet = true;
            //调用SoapSerializationEnvelope的setOutputSoapObject()方法,或者直接对bodyOut属性赋值,将前两步创建的SoapObject对象设为
            //SoapSerializationEnvelope的付出SOAP消息体
            envelope.bodyOut = soapObject;
    
            try
            {
                //调用WebService,调用对象的call()方法,并以SoapSerializationEnvelope作为参数调用远程Web Service
                ht.call(soapaction, envelope);
                if(envelope.getResponse() != null)
                {
                    //获取服务器响应返回的SOAP消息,调用完成后,访问SoapSerializationEnvelope对象的bodyIn属性,该属性返回一个
                    //SoapObject对象,该对象就代表了Web Service的返回消息。解析该SoapObject对象,即可获取调用Web Service的返回值
                    SoapObject so = (SoapObject) envelope.bodyIn;
                    //接下来就是从SoapObject对象中解析响应数据的过程了
                    outresult = so.getPropertyAsString(0);
    
    
                }
                else
                {
                    iscorrect=false;
                    outresult="From "+TAG+" Service no response";
    
    
                }
            }
            catch (Exception e) {
                iscorrect=false;
                outresult="From "+TAG+" "+e.toString();
    
    
            }
    
    
    
            return  outresult;
        }
    
        public boolean getiscorrect()
        {
            return iscorrect;
        }
    
    
    }
    

    5.新建一个包名Task,用于存放调用api的方法,这里新建一个与表名对应的类TaskProduct,代码如下

    import android.os.Handler;
    import android.util.Log;
    
    import com.example.sqlserver_byaspnet.Bean.Product;
    import com.example.sqlserver_byaspnet.Bean.SoapObject_Property;
    import com.example.sqlserver_byaspnet.Util.AsmxUtil;
    import com.example.sqlserver_byaspnet.Util.CommonUtil;
    import com.example.sqlserver_byaspnet.Util.ConnectUtil;
    
    import org.json.JSONArray;
    import org.json.JSONException;
    import org.json.JSONObject;
    
    import java.util.ArrayList;
    
    public class TaskProduct extends Thread
    {
        public int action=-1;
        public static final int ListAll=0;
        public static final int Add=1;
    
        private Handler handler;
    
        public int Id=0;
        public String Name="";
        public int Num=0;
    
        private ArrayList<String> arrtip;
        private ArrayList<Product> arrproduct;
        private String weburl;
    
        private boolean IsCorrect=true;
    
        public TaskProduct(Handler handler)
        {
            this.handler=handler;
    
            arrtip=new ArrayList<>();
            arrproduct=new ArrayList<>();
            weburl= ConnectUtil.WebUrl;
    
    
            IsCorrect=true;
        }
    
        public  ArrayList<Product> getarrProduct()
        {
            return  arrproduct;
        }
    
        public ArrayList<String> getarrTip()
        {
            return arrtip;
        }
    
        private void parserJson_List(String jsonStr) //解码json
        {
    
    
    
            try {
                // 根据json串构建一个JSON对象
                JSONObject obj = new JSONObject(jsonStr);
    //            // 获得名叫IsCorrect的字符串参数
                boolean iscorrect = obj.getBoolean("IsCorrect");
    
                if (iscorrect)
                {
    
                    JSONArray listArray = obj.getJSONArray("ArrXProduct");
                    for (int i = 0; i < listArray.length(); i++)
                    {
                        // 获得数组中指定下标的JSON对象
                        JSONObject list_item = listArray.getJSONObject(i);
                        Product item=new Product();
                        // 获得名叫item的字符串参数
                        int id = list_item.getInt("Id");
                        String name=list_item.getString("Name");
                        int num=list_item.getInt("Num");
    
    
                        item.Id=id;
                        item.Name=name;
                        item.Num=num;
    
                        arrproduct.add(item);
                    }
                }
                else
                {
                    arrtip.add(obj.getString("LastError"));
                }
    
    //
                // 获得名叫list的数组参数
    
            } catch (JSONException e) {
                e.printStackTrace();
                arrtip.add(e.toString());
    
            }
    
    
    
        }
        private void ExcuteListAll(boolean islaststep)
        {
            ArrayList<SoapObject_Property> ArrSOOP=new ArrayList<SoapObject_Property>();
    
    
    
            try
            {
                AsmxUtil asmxUtil=new AsmxUtil(weburl+"WebSqlService.asmx");  //api地址,下同
    
    
                String s=asmxUtil.GetasmxConent("List",ArrSOOP); //api中的方法
    
                Log.v("yzw",s);
                parserJson_List(s);
    
            }
            catch (Exception e)
            {
                e.printStackTrace();
                arrtip.add(e.toString());
            }
            finally
            {
    
                if (islaststep) //最后一步时,才发信息
                {
                    handler.sendEmptyMessage(ListAll);
                }
    
            }
    
        }
    
        private void ExcuteAdd(boolean islaststep)
        {
            ArrayList<SoapObject_Property> ArrSOOP=new ArrayList<SoapObject_Property>();
            SoapObject_Property SOOPName=new SoapObject_Property();
            SOOPName.PropertyName="Name";
            SOOPName.PropertyValue=Name;
            ArrSOOP.add(SOOPName);
    //
            SoapObject_Property SOOPNum=new SoapObject_Property();
            SOOPNum.PropertyName="Num";
            SOOPNum.PropertyValue=Num;
            ArrSOOP.add(SOOPNum);
    
    
    
            try
            {
                AsmxUtil asmxUtil=new AsmxUtil(weburl+"WebSqlService.asmx");
    
                String s=asmxUtil.GetasmxConent("Add",ArrSOOP);
    
      
    
    
                    arrtip.add(s);
    
            }
            catch (Exception e)
            {
                e.printStackTrace();
                arrtip.add(e.toString());
            }
            finally
            {
                ExcuteListAll(false);
                if (islaststep)
                {
                    handler.sendEmptyMessage(Add);
                }
    
            }
        }
    
        @Override
        public void run()
        {
    
            switch (action)
            {
                case ListAll:
                    ExcuteListAll(true);
                    break;
                case Add:
                    ExcuteAdd(true);
                    break;
            }
        }
    
    
    }
    

    6.在activity对应的布局文件写一个简单的界面,代码如下

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
    
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/TVList"/>
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="品名"/>
    
            <EditText
                android:layout_width="100dp"
                android:layout_height="wrap_content"
                android:id="@+id/ETName"/>
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="数量"/>
            <EditText
                android:layout_width="100dp"
                android:layout_height="wrap_content"
                android:id="@+id/ETNum"
                android:inputType="number"/>
        </LinearLayout>
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
            <Button
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/BtnAdd"
                android:text="添加"/>
            <Button
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/BtnList"
                android:text="列出"/>
        </LinearLayout>
    
    </LinearLayout>
    

    7.在activity页面实现最后调用,代码如下

    import androidx.appcompat.app.AppCompatActivity;
    import android.os.Bundle;
    import android.os.Handler;
    import android.os.Message;
    import android.view.View;
    import android.widget.EditText;
    import android.widget.TextView;
    import android.widget.Toast;
    
    import com.example.sqlserver_byaspnet.Bean.Product;
    import com.example.sqlserver_byaspnet.Task.TaskProduct;
    
    import java.util.ArrayList;
    
    import swaddle.yinzhenwei.waitdialog.WaitDialog;
    
    
    public class MainActivity extends AppCompatActivity implements View.OnClickListener
    {
        private TextView tvlist;
        private EditText etname;
        private EditText etnum;
        private WaitDialog waitDialog;
    
        private TaskProduct taskProduct;
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            tvlist=findViewById(R.id.TVList);
            etname=findViewById(R.id.ETName);
            etnum=findViewById(R.id.ETNum);
            waitDialog=new WaitDialog(this);
    
            findViewById(R.id.BtnAdd).setOnClickListener(this);
            findViewById(R.id.BtnList).setOnClickListener(this);
            RunList();
        }
        //运行分线程开始
        private void RunList()
        {
            taskProduct=new TaskProduct(handler);
            taskProduct.action=TaskProduct.ListAll;
            taskProduct.start();
        }
    
        private void RunAdd()
        {
    
            waitDialog.show();
            taskProduct=new TaskProduct(handler);
            taskProduct.action=TaskProduct.Add;
            taskProduct.Name=etname.getText().toString();
            taskProduct.Num=Integer.parseInt(etnum.getText().toString());
            taskProduct.start();
        }
    
        //运行分线程结束
    
    
        //handler处理开始
        private Handler handler = new Handler()
        {
            public void handleMessage(Message msg)
            {
                switch (msg.what)
                {
                    case TaskProduct.ListAll:
                        HandleListAll();
                        break;
                    case TaskProduct.Add: //添加后刷新一下列表;
                        HandleListAll();
                        break;
    
    
                }
                showtip();
    //            tiplist.clear();
                waitDialog.dismiss();
            }
        };
    
        private void HandleListAll() {
    
            ArrayList<Product> arrProduct = new ArrayList<>();
    
            arrProduct = taskProduct.getarrProduct();
            String out = "";
            if (arrProduct != null) {
                for (int i = 0; i < arrProduct.size(); i++) {
                    Product item = arrProduct.get(i);
                    String name = item.Name;
                    int num = item.Num;
                    out += String.format("品名:%s  库存:%d\n", name, num);
                }
                tvlist.setText(out);
    
            }
        }
    
    
        //handler处理结束
    
        private void showtip()
        {
            ArrayList<String> ListTip=taskProduct.getarrTip();
            String tip="";
            if (ListTip!=null)
            {
                if (ListTip.size()>0)
                {
                    for (int i=0;i<ListTip.size()-1;i++)
                    {
                        tip+=ListTip.get(i)+"\n";
                    }
                    tip+=ListTip.get(ListTip.size()-1); //最后一行不换行
                    //Toast.makeText(this,tip,Toast.LENGTH_SHORT).show();
                }
                if (tip.length()>0)
                {
                    Toast.makeText(this,tip,Toast.LENGTH_SHORT).show();
    
                }
    
                ListTip.clear();
                tip="";
    
            }
        }
    
        @Override
        public void onClick(View view) {
            switch (view.getId())
            {
                case R.id.BtnAdd:
                    RunAdd();
                    break;
                case R.id.BtnList:
                    RunList();
                    break;
            }
        }
    }
    

    好了,现在可以运行app了,运行效果如图3。
      在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 刚开始路走的都很顺,但是走到通过Android客户端上传图片到Asp.Net 服务器的时候出现很大的问题,图片是上传了,就是显示不出来,用照片查看器查看的时候显示:‘没有预览’,用画图软件打开的时候显示‘无效的位图...
  •  安卓端是无法将文件直接上传asp.net开发的网站的服务器上的,需要通过asp.net写一个api接口,然后安卓调用此接口,所以整个任务也可以分为两个部份,一个是asp.net端(服务端) 的api接口代码,另一个是安卓端...
  • 要实现一个功能,就是需要通过发送短信进行注册,现在想把短信验证码放到服务器的session值中,当客户端收到短信并提交短信码时由asp.net服务端进行判断,那么如何共享这个session那么需要在android客户端中添加几行...
  • ASP.NET-GCM 用于推送通知 GCM 在 Android 中的 ASP.NET 服务器
  • 两种方法直接连接,通过asp.net api连接,建议使用后种方法
  • Android客户端用Json与Asp.Net服务器交互信息 完整,可运行
  • 方便给新手学习的一个demo,使用的是Android studio和VS2015编写,VS的packpages没有引用进来
  • private string ftpServerIP = "服务器ip";//服务器ipprivate string ftpUserID = "ftp的用户名";//用户名private string ftpPassword = "ftp的密码";//密码//filename 为本地文件的绝对路径//serverDir为服务器上的...
  • 安卓服务器,本人亲测可用,对系统资源占用较多(200mb左右吧),可以做个小型的服务器,支持php、asp、mysql。
  • "spaghetti"},{"id":4,"desc":"sfas"},{"id":5,"desc":"test"}] of type org.json.JSONArray cannot be converted to JSONObject 可以在android端修复此问题,还是必须更改服务器的工作方式? 服务器只是通过控制器...
  • 资源要1分,因为我也没分 ...UploadServer是asp.net如果是mvc同理,改改就行,代码很不安全,只用于测试环境,正式的要判断他传的是不是图片 Java是测试程序,测试程序通过一般android客户端都会通过
  • 安卓交互项源码实现了安卓客户端跟web服务端的登录交互等功能,涉及的知识比较基础,C#的IIS服务器配置大家可以上网查一下,数据库请参考model类库中的变量建表,配置好服务器后,到安卓客户端代码中修改服务器ip...
  • ASP 本地服务器小软件

    2008-12-24 16:49:44
    简单易用的ASP 本地服务器 不用为没有IIS而犯难. 这个软件将助你完成动态网页的设计梦想! ASP本地服务器问题 悬赏分:50 - 提问时间2008-5-23 17:39 问题为何被关闭 我装了IIS了,为什么扩展名是‘htm’的就可以...
  • 第一次设计服务器,我在做毕业设计,模仿百度贴吧也做个贴吧,手机客户端的界面都做好了,可是需要服务端,遇到好几个问题,求大神们解答下: 1.我要做后台服务端来管理,那就需要服务器服务器是用tomcat是吗? 2....
  • 安卓和asp.net通过webservice上传图片到服务器 我自己试了,已经成功了,代码都写好了,自己贴上去试!
  • 查询速度快,但我们知道安卓容易被反编译,这样数据库就暴露了,即使做了安全加固,服务器也往往为了安全禁止或限制外部连接,所以一般不建议使用直接连接,另一种是通过api连接,我这里使用asp.net作为api。...
  • 安卓客户端,与上传图片有关的代码 ``` String BOUNDARY = UUID.randomUUID().toString(); String PREFIX = "--"; try { ByteArrayOutputStream bitmapByteOutput=new ByteArrayOutputStream(); bitmap....
  • Android的JSON示例(ASP+Access2003+IIS)

    热门讨论 2012-08-19 02:05:06
    1.服务器端为ASP+Access2003+IIS 2.移动端为Android2.1(大家可根据需要自行调整API Level) 二、主要功能: 1.移动端通过Button将EditText内容提交Request给服务器端 (示例为记录号,1或2,可选用HttpGet或HttpPost...
  • 对于已创建的裸金属服务器,仍采用AUTO模式,业务随机占用31000~32999中的一个端口。一键式重置密码插件随机占用的端口的原则是:在该范围内,系统会按照自小到大的顺序,占用当前空闲的端口。推荐您将一键式重置...
  • Android开发者如何搭建服务器

    万次阅读 多人点赞 2017-09-01 11:19:21
    Android 开发者有时也可以通过开发javaweb项目写接口然后供APP 调用,这时候你就需要一个服务器去发布接口项目,那么Android 开发者如何搭建自己的服务器?首先你需要选择一个服务器提供商,现在市面上有很多云端...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 10,698
精华内容 4,279
关键字:

安卓asp服务器