- 浏览: 675388 次
- 性别:
- 来自: 安徽
文章分类
- 全部博客 (252)
- Html/Div+CSS (12)
- Js/Jquery (34)
- Flex (2)
- Ajax (3)
- Java (35)
- C# (15)
- Spring (16)
- Hibernate (13)
- Struts2 (12)
- Struts1 (7)
- DWR (1)
- iBatis/myBatis (9)
- Tag(JSTL、EL) (1)
- Android (44)
- SQL (7)
- SEO (7)
- Exception (3)
- Tool (10)
- Other (3)
- WebService (9)
- Apache (7)
- Ext (0)
- Utils (12)
- thinking in programme (2)
- Hadoop (0)
- ActiveMQ (0)
- HTML5/CSS3 (0)
- WPF (1)
- NodeJs (1)
- 设计模式 (0)
- 程序人生 (1)
- 随笔 (1)
- Linux (1)
- Load Balance (0)
最新评论
-
drinkjava2:
太复杂了而且不通用,利用ThreadLocal可完美解决这一问 ...
JDBC的多条件动态查询 -
u013107014:
multipartRequest.getFiles(" ...
多文件上传 by MultipartFile and Multiple -
liyys:
可惜没讲你mysql数据库的表的设计
iBatis入门 -
Mapple_leave:
效果还是挺不错的,谢谢了。
中文简体与繁体的转换 -
arcpad:
JS禁用浏览器退格键
Android 开发中很多涉及网络通信,因为项目中涉及过一次,当时实现方式是 Http 请求,服务器端为 C# MVC 实现,所以这里想对这种方式进行一个总结。
Android 客户端:
首先封装一个 Http 请求帮助类
HttpHelper.java
package com.iflytek.leting.net; import java.io.BufferedReader; import java.io.DataOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; import java.util.List; import java.util.Map; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.NameValuePair; import org.apache.http.client.CookieStore; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.HttpPost; import org.apache.http.impl.client.AbstractHttpClient; import org.apache.http.impl.client.DefaultHttpClient; import android.util.Log; public abstract class HttpHelper { private final static String TAG = "HttpHelper"; private final static String SERVER_URL = "http://10.0.0.3/Test/"; private static CookieStore cookieStore; /** * @descrption 上传可变参数的Http请求方法 * @author xdwang * @create 2012-9-27下午8:06:28 * @param controllerName C# MVC中的controller * @param actionName C# MVC中的action * @param params 可变参数 * @return */ public static String invoke(String controllerName, String actionName, List<NameValuePair> params) { String result = null; try { String url = SERVER_URL + controllerName + "/" + actionName + "/"; Log.d(TAG, "url is" + url); HttpPost httpPost = new HttpPost(url); if (params != null && params.size() > 0) { HttpEntity entity = new UrlEncodedFormEntity(params, "UTF-8"); httpPost.setEntity(entity); } DefaultHttpClient httpClient = new DefaultHttpClient(); // 添加Cookie if (cookieStore != null) { httpClient.setCookieStore(cookieStore); } HttpResponse httpResponse = httpClient.execute(httpPost); StringBuilder builder = new StringBuilder(); BufferedReader reader = new BufferedReader(new InputStreamReader( httpResponse.getEntity().getContent())); for (String s = reader.readLine(); s != null; s = reader.readLine()) { builder.append(s); } result = builder.toString(); Log.d(TAG, "result is ( " + result + " )"); // 保存Cookie cookieStore = ((AbstractHttpClient) httpClient).getCookieStore(); } catch (Exception e) { Log.e(TAG, e.toString()); } Log.d(TAG, "over"); return result; } public static String invoke(String controllerName, String actionName) { return invoke(controllerName, actionName, null); } /** * @descrption 通过拼接的方式构造请求内容,实现参数传输以及文件传输 * @author xdwang * @create 2012-9-27下午7:06:20 * @param controllerName * .NETMVC中的controllerName * @param actionName * .NETMVC中的actionName * @param params * key:为C#方法接受的参数,value为参数值,支持多个参数 * @param files * key:为C#方法接受的参数,不要重复,value为参数值,支持上传多个附件 * @return * @throws IOException */ public static String httpPostByte(String controllerName, String actionName, Map<String, String> params, Map<String, byte[]> files) throws IOException { String BOUNDARY = java.util.UUID.randomUUID().toString(); String PREFIX = "--", LINEND = "\r\n"; String MULTIPART_FROM_DATA = "multipart/form-data"; String CHARSET = "UTF-8"; String url = SERVER_URL + controllerName + "/" + actionName + "/"; URL uri = new URL(url); HttpURLConnection conn = (HttpURLConnection) uri.openConnection(); conn.setReadTimeout(5 * 1000); // 缓存的最长时间 conn.setDoInput(true);// 允许输入 conn.setDoOutput(true);// 允许输出 conn.setUseCaches(false); // 不允许使用缓存 conn.setRequestMethod("POST"); conn.setRequestProperty("connection", "keep-alive"); conn.setRequestProperty("Charsert", "UTF-8"); conn.setRequestProperty("Content-Type", MULTIPART_FROM_DATA + ";boundary=" + BOUNDARY); // 首先组拼文本类型的参数 StringBuilder sb = new StringBuilder(); for (Map.Entry<String, String> entry : params.entrySet()) { sb.append(PREFIX); sb.append(BOUNDARY); sb.append(LINEND); sb.append("Content-Disposition: form-data; name=\"" + entry.getKey() + "\"" + LINEND); sb.append("Content-Type: text/plain; charset=" + CHARSET + LINEND); sb.append("Content-Transfer-Encoding: 8bit" + LINEND); sb.append(LINEND); sb.append(entry.getValue()); sb.append(LINEND); } DataOutputStream outStream = new DataOutputStream( conn.getOutputStream()); outStream.write(sb.toString().getBytes()); // 发送文件数据 if (files != null) { for (Map.Entry<String, byte[]> file : files.entrySet()) { StringBuilder sb1 = new StringBuilder(); sb1.append(PREFIX); sb1.append(BOUNDARY); sb1.append(LINEND); sb1.append("Content-Disposition: form-data; name=\"" + file.getKey() + "\"; filename=\"" + file.getKey() + "\"" + LINEND); sb1.append("Content-Type: application/octet-stream; charset=" + CHARSET + LINEND); sb1.append(LINEND); outStream.write(sb1.toString().getBytes()); //这里如何是File对象,则写成这种形式 // InputStream is = new FileInputStream(file.getValue()); // byte[] buffer = new byte[1024]; // int len = 0; // while ((len = is.read(buffer)) != -1) { // outStream.write(buffer, 0, len); // } outStream.write(file.getValue()); // is.close(); outStream.write(LINEND.getBytes()); } } // 请求结束标志 byte[] end_data = (PREFIX + BOUNDARY + PREFIX + LINEND).getBytes(); outStream.write(end_data); outStream.flush(); // 得到响应码 int res = conn.getResponseCode(); InputStream in = null; if (res == 200) { in = conn.getInputStream(); int ch; StringBuilder sb2 = new StringBuilder(); while ((ch = in.read()) != -1) { sb2.append((char) ch); } } return in == null ? null : in.toString(); } }
Android 中的调用:
AsyncTask<Void, Void, String> task = new AsyncTask<Void, Void, String>() { /** * 服务器端的返回值处理 */ @Override protected void onPostExecute(String result) { Log.d(TAG, result); try { JSONObject json = new JSONObject(result); uuid = json.getString("Result"); String picName = ""; String picSrc = ""; JSONObject picMap = json.getJSONObject("Message"); if (json.getJSONObject("Message") != null) { picSrc = picMap.getString("Value"); picName = picMap.getString("Key"); } } catch (JSONException e) { Log.e(TAG, e.toString()); } } @Override protected void onPreExecute() { super.onPreExecute(); } /** * 调用Http方法请求服务器端 */ @Override protected String doInBackground(Void... arg0) { try { // 直接传普通参数; NameValuePair param = new BasicNameValuePair("uuid", uuid); List<NameValuePair> params = new ArrayList<NameValuePair>(); params.add(param); return HttpHelper.invoke("GuessPic", "GetNextPicture", params); // 直接传普通参数和附件; Map<String, String> params = new HashMap<String, String>(); params.put("content", contentTemp); params.put("usId", guessPicture.usId); Map<String, byte[]> files = new HashMap<String, byte[]>(); files.put("soundBytes", totalBytes); return HttpHelper.httpPostByte("GuessPic", "SaveAudio", params, files); } catch (Exception e) { Log.e(TAG, e.toString()); return null; } } }; task.execute();
服务器端(C#MVC实现):
/// <summary> /// 下一张图片 /// </summary> /// <returns></returns> public JsonResult GetNextPicture(string uuid) { ResultMessage<string, KeyValuePair<string, string>> rm = new ResultMessage<string, KeyValuePair<string, string>>(); //….TODO逻辑处理 return Json(rm, JsonRequestBehavior.AllowGet); }
/// <summary> /// 保存上传一个文件和内容 /// </summary> /// <param name="content">内容</param> /// <param name="soundBytes">音频文件对象</param> /// <returns></returns> public JsonResult SaveAudio(string content, HttpPostedFileBase soundBytes, string usId) { ResultMessage<bool, object> rm = new ResultMessage<bool, object>(); byte[] bytes = new byte[soundBytes.InputStream.Length]; soundBytes.InputStream.Read(bytes, 0, bytes.Length); //….TODO逻辑处理 return Json(rm, JsonRequestBehavior.AllowGet); }
发表评论
-
C# 可选参数和命名参数
2013-09-05 22:39 1135不说废话,直接上代码 using Syste ... -
This version of ADT requires android SDK
2013-07-25 16:45 1599Windows系统下用Eclipse开发工具开发An ... -
C#中JSON序列化和反序列化
2012-12-13 09:33 2691在做项目中使用EF时,发现DataContractJsonSe ... -
Android学习13-----网络通信(4) WebView组件
2012-11-27 09:18 2520WebView 是一个开发的浏览 ... -
Android学习13-----网络通信(3) 与Web Service进行通讯
2012-11-26 09:40 1898这里我们的WebService使用xFire开发。 ... -
Android学习13-----网络通信(2) 与Socket交换数据
2012-11-23 09:11 3310对于网络开发而言,最常用的交互模式:WebService、We ... -
Android学习13-----网络通信(1) 与WEB服务器交换数据
2012-11-22 09:11 2196与Web服务器交互: 如果手机要想与 web ... -
Android学习11-----多媒体技术(5) 媒体录制
2012-11-16 08:10 1896在Android中通过android.media ... -
Android学习11-----多媒体技术(4) 使用摄像头拍照,多点触控
2012-11-15 08:37 2892一、摄像头拍照 前面说媒体播放 时了解了 ... -
Android学习11-----多媒体技术(3) 媒体播放
2012-11-14 08:25 1417在 Androi ... -
Android学习11-----多媒体技术(2) Animation
2012-11-13 08:47 1998一、渐变动画, Tweened Animation ... -
Android学习11-----多媒体技术(1) 绘制简单图形,Bitmap,Matrix
2012-11-12 08:48 1627一、绘制简单图 ... -
Android学习12-----手机服务(4) 传感器
2012-11-19 09:13 2023传感器一般用于游戏中,在 Android 系统中为 ... -
Android学习12-----手机服务(1) 取得电池电量和声音服务:AudioManager
2012-11-18 11:18 3508一、取得电池电量信息 ... -
Android学习10-----Android组件通信 (8) 桌面显示组件:AppWidget
2012-11-02 08:36 2041一、 AppWidget 在使用 Androi ... -
Android学习10-----Android组件通信 (7) 广播机制:Broadcast
2012-11-01 08:43 1519一、 广播: 广播也是一种信息的发送机制,在 ... -
Android学习10-----Android组件通信 (6) PendingIntent
2012-10-31 08:20 2266Intent 的主要功能是表示用 ... -
Android学习10-----Android组件通信 (5) Service
2012-10-30 08:25 1740Service 基本组成: ... -
Android学习10-----Android组件通信 (4) 消息机制
2012-10-29 08:22 1555在 Android 操作系统中存在着消息队列的操作 ... -
Android学习10-----Android组件通信 (3) ActivityGroup
2012-10-26 08:23 2322导航栏在 Android 中的应用是很常见的,前面 ...
相关推荐
在IT行业中,C# MVC(Model-View-Controller)框架被广泛用于构建高效、可维护的Web应用程序。这个“C# MVC移动开发demo”显然旨在展示如何利用C# MVC技术来开发针对移动设备的应用程序。下面我们将深入探讨C# MVC...
这些服务接收来自Android客户端的请求,并处理与SQL Server数据库的交互。C#提供了强大的ADO.NET框架,允许开发者方便地连接、查询和操作SQL Server数据库。使用SqlCommand对象执行SQL语句,SqlDataReader读取结果,...
在Android中,你可以使用`HttpURLConnection`或`OkHttp`库来发起HTTP请求,实现文件的POST方式上传。通常,你需要创建一个`MultipartEntity`或使用`RequestBody`(对于OkHttp)来封装文件和额外的数据,如文件名、...
MVP与MVC类似,也是一种分层架构,但在Android或Java开发中更为常见。在MVP模式中,Presenter作为模型和视图的中间人,负责协调两者间的交互。这有助于在Android环境中实现更清晰的代码组织和更好的测试能力。 1. *...
总结来说,这个源码包展示了Android客户端如何使用HTTP POST请求上传文件到Struts2服务端,以及服务端如何接收和处理这些文件。这涵盖了Android网络编程、文件操作、Struts2框架以及可能的跨平台通信技术。对于学习...
3. **控制器(Controller)**:控制器接收来自用户的请求,处理这些请求,与模型进行交互,然后选择适当的视图来显示结果。控制器是业务逻辑和用户界面之间的桥梁。 **ASP.NET MVC 4.0的新特性** 1. **移动支持**...
关于标签中提到的"C#",虽然本场景主要涉及的是Android和Struts2,但C#通常用于Windows应用开发或ASP.NET Web应用。在ASP.NET中,类似地,可以使用`HttpPostedFileBase`类来接收上传的文件,并通过`SaveAs()`方法将...
本资源"安卓Android源码——android与asp.net中的一般处理程序ashx进行交互.zip"提供了一个实例,展示了如何让Android客户端与ASP.NET服务器端通过HTTP协议进行数据交换。让我们深入探讨这个过程涉及的关键知识点。 ...
在ASHX文件中,你可以编写C#代码来接收Android客户端发送的请求,处理数据,然后返回JSON响应。 总结一下,这个压缩包提供的源码示例展示了如何在Android客户端使用HttpURLConnection与ASP.NET服务器上的ASHX处理...
通过以上步骤,我们能够实现一个基于 C# 的 WebService,它能有效地将数据库中的数据以 JSON 格式返回给客户端。这种方法简单易行,特别适合于初学者或小型项目。 接下来,我们还可以探索第二种方法:使用 WCF 编写...
在Spring MVC框架中,DispatcherServlet是整个Web应用的核心控制器,负责接收客户端的请求,并将请求分发到不同的处理组件。整个Spring MVC的请求处理流程如下: 首先,当Web容器(如Tomcat)接收到HTTP请求后,会...
Android仓库管理系统源码的核心架构通常采用MVC(Model-View-Controller)模式,这是一种常用的设计模式,能够清晰地分离数据处理、用户界面和控制逻辑。在这个系统中,Model负责数据的存储和处理,View负责展示信息...
- 学习C#语言,了解ASP.NET MVC或Web API框架。 4. **Ruby on Rails**: - Ruby on Rails是一种基于Ruby语言的Web开发框架,以其简洁性和开发效率著称。 - 学习Ruby语言基础,掌握Rails框架的核心概念,如...
2. **服务器API接口**:ASP.NET-GCM项目中,开发者需要实现一个服务器端API,该API接收设备的注册ID,并使用Google的GCM服务器接口发送消息。 3. **GCM服务器API密钥**:在ASP.NET应用中,需要配置一个Google API...
这意味着内容不仅包括基本的Android SDK使用、Activity管理、Intent通信、布局设计,还可能深入到数据库操作、服务、广播接收器、多媒体开发、权限管理、性能优化等方面,并且将这些知识与实际项目开发的实践经验相...
uniapp是一款跨平台的移动应用开发框架,它允许开发者用一套代码库来创建iOS、Android、H5以及小程序等多个平台的应用。而unipush则是uniapp提供的一个集成推送服务,通过与个推SDK的结合,可以实现高效稳定的推送...
开发者可能使用ASP.NET MVC或ASP.NET Core来构建Web API服务,这些服务可以接收来自移动应用的HTTP请求,执行预订操作,然后返回相应的结果。 支付功能是此源码中的关键部分,它意味着系统集成了支付网关,如支付宝...
- 使用苹果的SDK进行网络通信,可能涉及到Bonjour(本地网络发现)、HTTP/HTTPS请求或者自定义TCP/IP协议栈。 - IM功能实现,包括消息发送、接收、离线消息存储、推送通知等。 3. **Android客户端**: - Android...
这部分负责接收用户的请求,调用后台生成柱形图的逻辑,并将生成的图像以HTTP响应的形式返回给用户,展示在网页上。 综上所述,这个项目的核心在于利用Bitmap和Graphics类动态生成柱形图,并结合Web技术实现数据的...
C#提供了HTTP客户端库,可以方便地发送请求和接收响应,实现支付接口的调用。 4. **安全性**:C#提供内置的安全特性,如身份验证、授权和加密,对于处理敏感的交易信息至关重要。开发者可以利用这些功能确保用户的...