android用http连接web服务器,Android客户端post方式链接web(servlet)服务器实现简单登陆...

转载自http://blog.csdn.net/qq_28468727/article/details/52766633html

注意点:java

一、访问网络的工做不能在主线程(UI)中进行,若是耗时过程则会致使程序出错 ------(子线程中进行)android

二、子线程不能更新UI -------(主线程中进行)web

三、使用Handler配合子线程更新主线程时要注意内存泄露的问题,解决内存泄露的方法之一就是以弱引用的形式:数据库

//弱引用,防止内存泄露

privatestaticclassMyHandlerextendsHandler {

privatefinalWeakReference mActivity;

publicMyHandler(MainActivity activity) {

mActivity = newWeakReference(activity);

}

@Override

publicvoidhandleMessage(Message msg) {

System.out.println(msg);

if(mActivity.get() ==null) {

return;

}

mActivity.get().updateUIThread(msg);

}

}

四、在使用post向服务器发送请求时,要注意发送数据参数的格式,发送的参数是以key=value&key=value&key=value的格式进行发送的,value通常都要进行URL编码

//咱们请求的数据

String data = "password="+ URLEncoder.encode(passwd,"UTF-8")+

"&username="+URLEncoder.encode(username,"UTF-8");

五、使用模拟器进行测试时,URL中的IP地址不是127.0.0.1,而是10.0.2.2

privatestaticString LOGIN_URL ="http://10.0.2.2:8080/webtest/loginaction";

实例:在Android客户端中输入用户名和密码以后,将其提交至服务器,服务器进行判断用户名和密码是否正确,若是正确则返回success,失败则返回fail缓存

配置服务器tomcat

在搭建好tomcat服务器以后,在eclipse中建立servlet文件服务器

LoginAction.java(服务器)网络

packageLogin;

importjava.io.IOException;

importjava.io.OutputStream;

importjava.io.PrintWriter;

importjava.util.HashMap;

importjavax.servlet.ServletException;

importjavax.servlet.annotation.WebServlet;

importjavax.servlet.http.HttpServlet;

importjavax.servlet.http.HttpServletRequest;

importjavax.servlet.http.HttpServletResponse;

importjava.util.HashMap;

importjava.util.Map;

/**

* Servlet implementation class LoginAction

*/

@WebServlet("/LoginAction")

publicclassLoginActionextendsHttpServlet {

privatestaticfinallongserialVersionUID = 1L;

/**

* @see HttpServlet#HttpServlet()

*/

publicLoginAction() {

super();

// TODO Auto-generated constructor stub

}

/**

* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)

*/

protectedvoiddoGet(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException {

}

/**

* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)

*/

protectedvoiddoPost(HttpServletRequest request, HttpServletResponse response)throwsServletException, IOException {

// TODO Auto-generated method stub

doGet(request, response);

//设置客户端的解码方式为utf-8

response.setContentType("text/html;charset=utf-8");

//

response.setCharacterEncoding("UTF-8");

PrintWriter out = response.getWriter();

String result = "";

String name = request.getParameter("username");

String pwd = request.getParameter("password");

//System.out.println("name="+name);

//System.out.println("password="+pwd);

if(name.equals("admin")&&pwd.equals("123")) {

result = "success";

}

else{

result = "fail";

}

out.write(result);

out.flush();

out.close();

System.out.println(result);

}

}

在eclipse中中配置web.xm文件,该文件通常在WebContent ---> WEB-INF的文件夹下app

在web.xml文件中添加以下代码:

LoginAction

Login.LoginAction

LoginAction

/loginaction

Android客户端

MainActivity.java

packagecom.example.administrator.httpconnectlogin;

importandroid.os.Handler;

importandroid.os.Message;

importandroid.support.v7.app.AppCompatActivity;

importandroid.os.Bundle;

importandroid.util.Log;

importandroid.view.View;

importandroid.widget.Button;

importandroid.widget.EditText;

importandroid.widget.Toast;

importjava.lang.ref.WeakReference;

publicclassMainActivityextendsAppCompatActivity {

privateButton button;

privateEditText edit1,edit2;

privateMyHandler myhandler =newMyHandler(this);

publicstaticfinalString TAG="MainActivity";

@Override

protectedvoidonCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

InitView();

}

//弱引用,防止内存泄露

privatestaticclassMyHandlerextendsHandler {

privatefinalWeakReference mActivity;

publicMyHandler(MainActivity activity) {

mActivity = newWeakReference(activity);

}

@Override

publicvoidhandleMessage(Message msg) {

System.out.println(msg);

if(mActivity.get() ==null) {

return;

}

mActivity.get().updateUIThread(msg);

}

}

//配合子线程更新UI线程

privatevoidupdateUIThread(Message msg){

Bundle bundle = newBundle();

bundle = msg.getData();

String result = bundle.getString("result");

Toast.makeText(MainActivity.this, result, Toast.LENGTH_SHORT).show();

}

voidInitView(){

button = (Button) findViewById(R.id.btn);

edit1 = (EditText) findViewById(R.id.editText1);

edit2 = (EditText) findViewById(R.id.editText2);

// Toast.makeText(MainActivity.this, "str111", Toast.LENGTH_SHORT).show();

button.setOnClickListener(newView.OnClickListener() {

@Override

publicvoidonClick(View view) {

if(edit1.toString().isEmpty()||edit2.toString().isEmpty()) {

Toast.makeText(MainActivity.this,"学号或密码不能为空", Toast.LENGTH_SHORT).show();

}

else{

//开启访问数据库线程

newThread(newRunnable() {

@Override

publicvoidrun() {

String str = HttpLogin.LoginByPost(edit1.getText().toString(),edit2.getText().toString());

Bundle bundle = newBundle();

bundle.putString("result",str);

Message msg = newMessage();

msg.setData(bundle);

myhandler.sendMessage(msg);

}

}).start();

}

}

});

}

}

链接服务器的自定义工具类

HttpLogin.java

packagecom.example.administrator.httpconnectlogin;

importandroid.util.Log;

importjava.io.BufferedReader;

importjava.io.ByteArrayOutputStream;

importjava.io.IOException;

importjava.io.InputStream;

importjava.io.InputStreamReader;

importjava.io.OutputStream;

importjava.net.HttpURLConnection;

importjava.net.MalformedURLException;

importjava.net.URL;

importjava.net.URLEncoder;

importjava.util.HashMap;

importjava.util.Map;

/**

* Created by Administrator on 2016/10/5.

*/

publicclassHttpLogin {

privatestaticString LOGIN_URL ="http://10.0.2.2:8080/webtest/loginaction";

publicstaticString LoginByPost(String username,String passwd){

Log.d(MainActivity.TAG,"启动登陆线程");

String msg = "";

try{

//初始化URL

URL url = newURL(LOGIN_URL);

HttpURLConnection conn = (HttpURLConnection) url.openConnection();

Log.d(MainActivity.TAG,"11111");

//设置请求方式

conn.setRequestMethod("POST");

//设置超时信息

conn.setReadTimeout(5000);

conn.setConnectTimeout(5000);

//设置容许输入

conn.setDoInput(true);

//设置容许输出

conn.setDoOutput(true);

//post方式不能设置缓存,需手动设置为false

conn.setUseCaches(false);

//咱们请求的数据

String data = "password="+ URLEncoder.encode(passwd,"UTF-8")+

"&username="+URLEncoder.encode(username,"UTF-8");

//獲取輸出流

OutputStream out = conn.getOutputStream();

out.write(data.getBytes());

out.flush();

out.close();

conn.connect();

if(conn.getResponseCode() ==200) {

// 获取响应的输入流对象

InputStream is = conn.getInputStream();

// 建立字节输出流对象

ByteArrayOutputStream message = newByteArrayOutputStream();

// 定义读取的长度

intlen =0;

// 定义缓冲区

bytebuffer[] =newbyte[1024];

// 按照缓冲区的大小,循环读取

while((len = is.read(buffer)) != -1) {

// 根据读取的长度写入到os对象中

message.write(buffer, 0, len);

}

// 释放资源

is.close();

message.close();

// 返回字符串

msg = newString(message.toByteArray());

returnmsg;

}

} catch(MalformedURLException e) {

e.printStackTrace();

} catch(IOException e) {

e.printStackTrace();

}

Log.d(MainActivity.TAG,"exit");

returnmsg;

}

}

在AndroidManifest文件中添加访问网络权限

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值