【Android-网络通讯】 客户端与.Net服务端Http通讯
以登陆系统为例:
一、创建服务端程序
1、打开VS2012,新建项目,创建ASP.NET WEB应用程序 ,命名为MyApp
2、添加新建项,选择一般处理程序,创建Login.ashx
C# Code: Login.ashx
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web; namespace MyApp.Remote
{
/// <summary>
/// Login 的摘要说明
/// </summary>
public class Login : IHttpHandler
{ public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
switch (context.Request["type"])
{
case "login":
loginValidate(context);
break;
default:
break;
}
} /// <summary>
/// 验证登陆
/// </summary>
/// <param name="context"></param>
private void loginValidate(HttpContext context)
{
string account = context.Request["Account"].ToString();
string password = context.Request["Password"].ToString();
if (account == "" && password == "")
{
string realName="HelloWord";
context.Response.Write("{\"Result\":\"1\",\"RealName\":\""+realName+"\"}");
//实际输出:{"Result":"1","RealName":"HelloWord"}
//注意:双引号需要用转义符\
}
else
{
context.Response.Write("{\"Result\":\"0\"}");
} } public bool IsReusable
{
get
{
return false;
}
}
}
}
3、到这里就完成服务端的验证代码登陆了。
浏览器输入地址访问:http://localhost:11946/Remote/Login.ashx?type=login&Account=123&Password=123
4、这时候程序还没有部署到IIS,那么如何在VS调试的时候,客户端可以通过IP访问该程序?
二、创建客户端程序
1、界面布局 layout \ activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_margin="10dp"
android:orientation="vertical" > <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" > <TextView
android:layout_width="100dp"
android:layout_height="wrap_content"
android:text="账号" /> <EditText
android:id="@+id/edittext_loginAccount"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:ems="10"
android:inputType="number" > <requestFocus />
</EditText>
</LinearLayout> <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" > <TextView
android:layout_width="100dp"
android:layout_height="wrap_content"
android:text="密码" /> <EditText
android:id="@+id/editetext_loginPassword"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:ems="10"
android:inputType="textPassword" />
</LinearLayout> <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center" > <CheckBox
android:id="@+id/checkbox_remindPassword"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="记住密码" />
</LinearLayout> <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center" > <Button
android:id="@+id/button_login"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="登录" />
</LinearLayout> </LinearLayout>
2、Java Code : MainActivity.java
package com.example.net; import java.io.BufferedReader;
import java.io.InputStreamReader; import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONObject; import android.app.Activity;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.StrictMode;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast; public class MainActivity extends Activity { private String ServerUrl = "http://192.168.137.210:11946/Remote/";
private EditText et_loginAccount;
private EditText et_loginPassword;
private CheckBox cb_remindPassword;
private Button btn_login;
private ProgressDialog progressDialog; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects().detectLeakedClosableObjects().penaltyLog().penaltyDeath().build()); et_loginAccount = (EditText) findViewById(R.id.edittext_loginAccount);
et_loginPassword = (EditText) findViewById(R.id.editetext_loginPassword);
cb_remindPassword = (CheckBox) findViewById(R.id.checkbox_remindPassword);
btn_login = (Button) findViewById(R.id.button_login); btn_login.setOnClickListener(new OnClickListener() { @Override
public void onClick(View v) {
// loading 对话框
progressDialog = ProgressDialog.show(MainActivity.this, "", "服务器连接中...", true, false);
// 开启线程去验证登录
new Thread() {
@Override
public void run() {
// 向handler发消息
mHandler.sendEmptyMessage(0);
}
}.start();
}
}); } private Handler mHandler = new Handler() { @Override
public void handleMessage(Message msg) {
// 登录验证
loginValidate();
} }; private void loginValidate() {
// 打开网络连接
HttpClient client = new DefaultHttpClient();
StringBuilder builder = new StringBuilder();
// 服务器提交地址
String url = ServerUrl + "Login.ashx?type=login&Account=" + et_loginAccount.getText().toString() + "&Password=" + et_loginPassword.getText().toString();
HttpGet httpGet = new HttpGet(url);
try {
HttpResponse response = client.execute(httpGet);
BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
// 填充数据流
for (String s = reader.readLine(); s != null; s = reader.readLine()) {
builder.append(s);
}
// 读取Json返回数组
JSONObject jsonObject = new JSONObject(builder.toString());
String re_result = jsonObject.getString("Result");
String re_realName = jsonObject.getString("RealName");
if (re_result.equals("1")) {
Toast.makeText(MainActivity.this, "验证成功!" + re_realName, Toast.LENGTH_SHORT).show();
// TODO:跳转页面
} else {
Toast.makeText(MainActivity.this, "登录失败", Toast.LENGTH_SHORT).show();
}
progressDialog.dismiss();
} catch (Exception e) {
e.printStackTrace();
Toast.makeText(MainActivity.this, "服务器数据读取失败", Toast.LENGTH_SHORT).show();
progressDialog.dismiss();
}
} }
StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder().detectDiskReads().detectDiskWrites().detectNetwork().penaltyLog().build());
StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder().detectLeakedSqlLiteObjects().detectLeakedClosableObjects().penaltyLog().penaltyDeath().build());
少了上面两句代码会报错android.os.NetworkOnMainThreadException即,在主线程访问网络时出的异常
Android在4.0之前的版本支持在主线程中访问网络,但是在4.0以后对这部分程序进行了优化,也就是说访问网络的代码不能写在主线程中了。
稍后研究多线程
3、别放了加上权限 AndroidManifest.xml
<!-- sd卡读取权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> <!-- 访问网络权限 -->
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WAKE_LOCK" /> <!-- 完全退出程序权限 -->
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />
【Android-网络通讯】 客户端与.Net服务端Http通讯的更多相关文章
- android客户端app和服务端交互token的作用
Android客户端和服务端如何使用Token和Session niceheart关注1人评论34644人阅读2014-09-16 16:38:44 对于初学者来说,对Token和Session的 ...
- 网络版shell之网络编程练习篇--telnet服务端
网络版shell之网络编程练习篇--telnet服务端 以前写过一个shell命令解释器,对与shell命令解释器的执行流程有了清晰的认识,这段时间学习网络编程,至于网络编程的细节以及知识点,已经 ...
- C#使用Thrift简介,C#客户端和Java服务端相互交互
C#使用Thrift简介,C#客户端和Java服务端相互交互 本文主要介绍两部分内容: C#中使用Thrift简介 用Java创建一个服务端,用C#创建一个客户端通过thrift与其交互. 用纯C#实 ...
- 利用python多线程实现多个客户端与单个服务端的远程ssh
本次实验设计两个方面的代码,第一个是客户端,代码如下: import os from socket import * c = socket(AF_INET,SOCK_STREAM) c.connect ...
- 6-1 建立客户端与zk服务端的连接
6-1 建立客户端与zk服务端的连接 zookeeper原生java api使用 会话连接与恢复; 节点的增删改查; watch与acl的相关操作; 导入jar包;
- Linux下更改oracle客户端字符集和服务端字符集
from:http://blog.csdn.net/chid/article/details/6166506 Linux 下更改 oracle 客户端字符集和服务端字符集 1.Linux 下更改 or ...
- XFire客户端调用CXF服务端(四)
前面章节:http://www.cnblogs.com/xiehongwei/p/8082337.html 已经开发出了CXF服务端,现在用XFire开发客户端调用CXF服务端,代码如下: impor ...
- java版gRPC实战之六:客户端动态获取服务端地址
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- 关于kafka客户端版本与服务端版本不一致导致的一次坑
上周开发了一个功能,需要使用kafka接上游数据并入库,本地开发时,自己安装了一个kafka服务,开发测试时使用本地的kafka服务给主题发消息,然后在自己本地的代码中进行调试.使用的kafka版本如 ...
随机推荐
- [百家号]铁流:华为Hi1620发布 自研内核还是ARM改?
华为Hi1620发布 自研内核还是ARM改? https://baijiahao.baidu.com/s?id=1618735211251270521&wfr=spider&for=p ...
- [转]史上最最最详细的手写Promise教程
我们工作中免不了运用promise用来解决异步回调问题.平时用的很多库或者插件都运用了promise 例如axios.fetch等等.但是你知道promise是咋写出来的呢? 别怕-这里有本promi ...
- selenium+java+testNG+maven环境搭建
一.简单介绍 1.selenium: Selenium是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.支持的浏览器包括IE.Mozilla Fir ...
- 线段树维护动态连续子段HDU1540
题意:http://acm.hdu.edu.cn/showproblem.php?pid=1540 #define IOS ios_base::sync_with_stdio(0); cin.tie( ...
- 移动端APP测试概要
APP测试点总结(全面) 一.功能性测试: ——根据产品需求文档编写测试用例. ——软件设计文档编写用例. 注意:就是根据产品需求文档编写测试用例而进行测试. 二.兼容性测试: ——android版本 ...
- Delphi cxpagecontrol融合窗体
功能说明: 一.在需要融合的每个窗体加一句 initialization RegisterClasses([TFrmDataDict]); //类名 二.cxpagecontrol融合窗体,在调用时 ...
- 怎样理解undefined和 null
前言: undefined表示 "未定义", null 表示 "空" 第一步: 一般在变量或属性没有声明或者声明以后没有赋值时, 这个变量的值就是undefin ...
- hdu 1305 还是字典树
#include<cstdio> #include<iostream> #include<string> #include<cstdlib> #defi ...
- Java lesson08 Homework
1:1. 写一个类Param,声明四个成员变量a.b.c.d,分别赋予四种访问权限. (1)试验在同一个包中的另一个类里能访问哪几个变量? (2)试验在不同包中的另一个类里能访问哪几个变量? (3)试 ...
- ASP.NET Core 2.0 中读取 Request.Body 的正确姿势
原文:ASP.NET Core 中读取 Request.Body 的正确姿势 ASP.NET Core 中的 Request.Body 虽然是一个 Stream ,但它是一个与众不同的 Stream ...