【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版本如 ...
随机推荐
- [转帖] 飞腾FT2000+ CPU的进展(2019.6)
中国长城:拟进一步收购飞腾股权,强化信息基础设施国产化平台地位 2019-06-26 09:28 http://www.sohu.com/a/323065095_100016383 今年年中的事情 浪 ...
- python — 生成器、推导式、递归
目录 1 生成器(函数的变异) 2 推导式 3 递归 1 生成器(函数的变异) 判断一个函数是否是生成器函数:只需看函数内部是否有yield # 生成器函数(内部是否包含yield) def func ...
- javascript——onsubmit和onreset事件 和开发中常用的方式
<head> <meta charset="UTF-8"> <title></title> <script> funct ...
- LeetCode:1179.重新格式化部门表
题目链接:https://leetcode-cn.com/problems/reformat-department-table/ 题目 部门表 Department: +--------------- ...
- css3之媒体查询
<html> <head> <meta charset="utf-8"> <style> body{ background-colo ...
- @media screen媒体查询实现页面自适应布局
@media screen and (min-width:1200px){ //大于等于1200px才会进入 } @media screen and (max-width:375px) { //小 ...
- oracle的listagg函数
今天需要将 BDST_ID相同的PROJECT_ID用逗号分隔拼成一个字符串,于是想到了oracle的listagg函数 表名为PM_BDST_PROJECT select tt.BDST_ID, l ...
- Java秒杀实战 (七)安全优化
转自:https://blog.csdn.net/qq_41305266/article/details/81174782 一.隐藏秒杀地址 思路:秒杀开始前,先去请求接口获取秒杀地址 1.接口改造, ...
- python使用openpyxl操作execl
openpyxl openpyxl可以用来对excel进行操作,但只能操作xlsx文件而不能操作xls文件. 主要用到三个概念:Workbooks,Sheets,Cells.Workbook就是一个e ...
- Computer Vision_2_Active Shape Models:Active Shape Models-Their Training and Application——1995
此为计算机视觉部分,主要侧重在底层特征提取,视频分析,跟踪,目标检测和识别方面等方面. 1. Active Appearance Models 活动表观模型和活动轮廓模型基本思想来源 Snake,现在 ...