Android - 向服务器发送数据(GET).
在此,使用HTTP协议,通过GET请求,向服务器发送请求,这种方式适合于数据量小,数据安全性要求不高的情况下.
一,服务器端,使用Servlet.
在服务器端,定义一个HttpServlet的子类,以及一个Filter的子类(用于统一编码,防止出现乱码).
package spt.servlet; import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; /**
* type 'http://localhost:8080/ReceiveAndroid/ServletForGETMethod?name=juk&pwd=lis'
* for the browser.
*/
@WebServlet("/ServletForGETMethod")
public class ServletForGETMethod extends HttpServlet {
private static final long serialVersionUID = 1L; /**
* @see HttpServlet#HttpServlet()
*/
public ServletForGETMethod() {
super();
} /**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String name = request.getParameter("name");
String pwd = request.getParameter("pwd");
System.out.println("name:" + name + " pwd:" + pwd); } /**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
* response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
} }
package spt.servlet.filter; import java.io.IOException;
import java.io.UnsupportedEncodingException; import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper; //filter all servlets.
@WebFilter("/*")
public class EncodingFilter implements Filter { public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest httpReq = (HttpServletRequest) servletRequest;
if ("GET".equals(httpReq.getMethod()))
filterChain.doFilter(new HttpServletRequestEncodingWrapper(httpReq), servletResponse);
else {
httpReq.setCharacterEncoding("utf-8");
filterChain.doFilter(httpReq, servletResponse);
}
} public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub } /**inner class dealing for 'GET' method.
* @author Administrator
*2015-1-27
*/
private class HttpServletRequestEncodingWrapper extends HttpServletRequestWrapper { public HttpServletRequestEncodingWrapper(HttpServletRequest request) {
super(request);
} @Override
public String getParameter(String name) {
//encode with 'iso', and than decode with 'utf'.
String val = super.getRequest().getParameter(name);
if (null != val) {
try {
return new String(val.getBytes("iso8859-1"), "utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
return super.getParameter(name);
}
} public void destroy() {
// TODO Auto-generated method stub } }
在主机(服务器)上,往浏览器中输入'http://localhost:8080/ReceiveAndroid/ServletForGETMethod?name=juk&pwd=lis', 若在控制台打印需要的结果,则表示服务器端的Servlet已经编写好.
二,Android的业务逻辑层类,主要是将业务逻辑独立于Android的Activity.
package spt.http.get.assist; import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry; import android.os.Handler; /**用户向服务器端发送数据的类.
* @author Administrator
*
*/
public class SendDataToServer {
private static final int TIME_OUT = 10000; // 超时时间.
// 连接服务器的url.
private static final String URL = "http://192.168.1.101:8080/ReceiveAndroid/ServletForGETMethod";
// 标识是否连接到服务器成功.
public static final int SEND_SUCCESS = 1;
public static final int SEND_FAIL = 0; private Handler handler = null; public SendDataToServer(Handler handler) {
this.handler = handler;
} /**
* 往服务器发送数据.
*
* @param name
* @param pwd
*/
public void send(String name, String pwd) {
// 这里params要传递到另外一个方法,加final为了防止被修改.
final Map<String, String> params = new HashMap<String, String>();
params.put("name", name);
params.put("pwd", pwd); // 启动新的线程连接服务器.
new Thread(new Runnable() { @Override
public void run() {
// 使用get请求连接.
try {
if (getSend(params, URL, "utf-8"))
handler.sendEmptyMessage(SEND_SUCCESS);
else
handler.sendEmptyMessage(SEND_FAIL);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
} /**发送get请求的方法.
* @param params 请求参数的键-值对.
* @param url
* @param encoding 使用指定编码对参数值进行编码.
* @return
* @throws MalformedURLException
* @throws IOException
*/
private boolean getSend(Map<String, String> params, String url,
String encoding) throws MalformedURLException, IOException {
StringBuilder sb = new StringBuilder();
// 向url中添加参数.
sb.append(url).append("?");
for (Entry<String, String> param : params.entrySet()) {
sb.append(param.getKey()).append("=")
.append(URLEncoder.encode(param.getValue(), encoding))
.append("&");
}
if (params.size() > 0)
sb.deleteCharAt(sb.length() - 1); // 去掉末尾的'&'.
HttpURLConnection conn = (HttpURLConnection) new URL(sb.toString())
.openConnection();
conn.setConnectTimeout(TIME_OUT);
conn.setRequestMethod("GET"); // GET是大小写敏感的. return conn.getResponseCode() == 200; // 等于200表示发送成功.
}
}
三:Activity类:
package spt.http.get.activity; import java.lang.ref.WeakReference; import spt.http.get.assist.SendDataToServer;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast; public class MainActivity extends Activity {
//view.
private EditText edt_name = null;
private EditText edt_pwd = null;
private Button btn_ok = null; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initListener();
} /**
* 初始化View.
*/
private void initView() {
edt_name = (EditText)findViewById(R.id.edt_name);
edt_pwd = (EditText)findViewById(R.id.edt_pwd);
btn_ok = (Button)findViewById(R.id.btn_ok); //test:
edt_name.setText("你好");
edt_pwd.setText("abc");
} /**使用静态内部类,解决'This Handler class should be static or leaks might occur',以免造成内存泄露.
* @author Administrator
*
*/
private static class StatusHandler extends Handler {
WeakReference<MainActivity> iMainActivity = null; public StatusHandler(MainActivity mainActivity) {
iMainActivity = new WeakReference<MainActivity>(mainActivity);
} @Override
public void handleMessage(Message msg) {
switch (msg.what) {
case SendDataToServer.SEND_SUCCESS:
//有iMainActivity.get()和iMainActivity.getClass().
Toast.makeText(iMainActivity.get(), "发送成功", Toast.LENGTH_SHORT).show();
break;
case SendDataToServer.SEND_FAIL:
Toast.makeText(iMainActivity.get(), "发送失败", Toast.LENGTH_SHORT).show();
break;
default:
throw new RuntimeException("未知的发送结果!");
}
}
} /**
* 处理发送是否成功的状态的Handler.
*/
private final Handler handler = new StatusHandler(this); /**
* 初始化监听器.
*/
private void initListener() {
btn_ok.setOnClickListener(new Button.OnClickListener() { @Override
public void onClick(View v) {
String name = edt_name.getText().toString();
String pwd = edt_pwd.getText().toString();
if(name.isEmpty() || pwd.isEmpty()) {
Toast.makeText(MainActivity.this, "用户名和密码不能为空", Toast.LENGTH_SHORT).show();
return;
}
new SendDataToServer(handler).send(name, pwd);
}
});
}
}
稍微留意的是,Activity类中的Handler的子类定义为静态类,并保存对Activity的弱引用,防止内存泄露.简略解释在我的博文 Android - This Handler class should be static or leaks might occur. 中.
四, 添加必要权限
在AndroidManifest.xml中,添加
<uses-permission android:name="android.permission.INTERNET" />
以对网络的访问.
Android - 向服务器发送数据(GET).的更多相关文章
- Android - 向服务器发送数据(POST) - HTTPClient.
该篇文章主要说明使用Apache提供的HTTPClient,通过post方式,向服务器发送数据.由于有些东西在 Android - 向服务器发送数据(GET)中提到过,就不再重复. 一,Android ...
- 使用post()方法以POST方式从服务器发送数据
使用post()方法以POST方式从服务器发送数据 与get()方法相比,post()方法多用于以POST方式向服务器发送数据,服务器接收到数据之后,进行处理,并将处理结果返回页面,调用格式如下: $ ...
- C语言Socket-单工通信(客户端向服务器发送数据)
服务端(server) #include <stdio.h> #include <winsock2.h> #pragma comment(lib,"ws2_32.li ...
- Android使用HttpClient以Post、Get请求服务器发送数据的方式(普通和json)
讲这个之前,我们先来说说get和post两种请求的区别吧!!! 1. GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditPosts.jsp?name=te ...
- Android使用HttpUrlConnection请求服务器发送数据详解
HttpUrlConnection是java内置的api,在java.net包下,那么,它请求网络同样也有get请求和post请求两种方式.最常用的Http请求无非是get和post,get请求可以获 ...
- Android 给服务器发送网络请求
今天听得有点蒙,因为服务器的问题,这边建立服务器的话,学长用的是Idea建立的Spring之类的方法去搞服务器. 然后就是用Android去给这个服务器发送请求,大致效果还是懂的,就是像网站发送请求, ...
- node中一个基本的HTTP客户端向本地的HTTP服务器发送数据
上一篇讲到了node可以轻松的向其他请求数据. 这一篇就来讲讲向本地服务器的数据交互. HTTP服务器代码,s.js var http=require("http"); var s ...
- android DatagramSocket send 发送数据出错
安卓4.0以后好像不能在主线程里面使用 socket 所以不管是发送数据还是接收数据需要新开一个了线程: 以下代码是我点击发送是代码: new Thread(new Runnable() { @Ove ...
- Android解析服务器Json数据实例
Json数据信息如下: { "movies": [ { "movie": "Avengers", "year": 201 ...
随机推荐
- C#的装箱和拆箱
1:装箱 其实就是将一个值类型的转换成一个引用类型,或者把值类型转换成一个被该值类型那个应用的接口类型,这个过程会使用堆栈.被装箱的值是作为一个复制赋给对象的. int intValue = 100 ...
- Navigation Drawer(导航抽屉)
目录(?)[-] 创建一个导航抽屉 创建抽屉布局 初始化抽屉列表 处理导航项选点击事件 监听导航抽屉打开和关闭事件 点击应用图标来打开和关闭导航抽屉 创建一个导航抽屉 导航抽屉是一个位于屏幕左侧边缘用 ...
- 数学:lucas定理的总结
今天考试的题目中有大组合数取模,不会唉,丢了45分,我真是个弱鸡,现在还不会lucas. 所以今天看了一下,定理差不多是: (1)Lucas定理:p为素数,则有: 即:lucas(n,m,p)=c(n ...
- ORA-65096: invalid common user or role name
CREATE USER xx IDENTIFIED BY yy DEFAULT TABLESPACE USERS TEMPORARY TABLESPACE TEMP PROFILE "DEF ...
- django 项目部署在 Apache 后, 设置二级域名(Apache虚拟主机 、 万网二级域名设置)
上一篇文章简单说了怎么把django的项目部署到Apache上. 现在想弄个二级域名,也就是我原来有个域名 www.mysite.com,现在我想弄个 bbs.mysite.com ,该怎么做呢. 要 ...
- Linux内核学习笔记2——Linux内核源码结构
一 内核组成部分 内核是一个操作系统的核心,主要由五个部分组成:进程调度,内存管理,虚拟文件系统,网络结构,进程间通信. 1.进程调度(SCHED) 控制进程对CPU的访问.当需要选择下一个进程运行时 ...
- 1003: A Bug
题目链接:http://172.16.200.33/JudgeOnline/problem.php?id=1003 分析: (1)题意很简单,就是检查一堆数据中是否有同性恋,找出主要矛盾是如果1喜欢2 ...
- 最短路SPFA
用邻接矩阵a表示一幅图,a[i][j]表示从点i到点j的边长,如果为0则无边.(这是无负边,0边的情况) 这张图有T个点,C条边,要求求出从Ts走到Te的最短路. 用f[i]表示从Ts走到i点的最短路 ...
- Android——Cocosd2d-x手机游戏开发学习思路
手机APP应用如雨后春笋般冒了出来,而在众多的APP应用中,游戏占据了半壁江山.它丰富着人们的业余生活,增进了人们之间的沟通交流.也有许多开发的朋友对游戏开发情有独钟,他们不止是享受着有很多的人们去下 ...
- struts2 表单处理
在这篇教程里我们将探究如何处理表单提交.本文例子介绍: javabean存储表单数据 在action中重写validate方法进行简单的校验 创建一个struts2表单并和javabean匹配 jav ...