青玄 发表于 2014-11-7 21:06:24

android学习之访问互联网--服务端的登录验证

实现原理概述:
   通过客户端输入用户名和密码,然后提交到服务端进行验证的过程!因为考虑到是联系,数据较小,所以服务端的用户名与密码就存到list集合里面了!
首先,需要配置服务端的代码!这里是有sevlet来实现的:

package cn.cxrh.daomain;

import java.io.IOException;
import java.util.*;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.omg.CORBA.Request;

import cn.cxrh.daomain.*;

import com.sun.xml.internal.bind.v2.schemagen.xmlschema.List;

public class UserSer extends HttpServlet {

        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp)
                        throws ServletException, IOException {
                // TODO Auto-generated method stub
                boolean flag = false;
                ArrayList<User> users =new ArrayList<User>();
                users.add(new User("xiaobaima","123","2014-11-07 17:14:45"));
                users.add(new User("xiaojiayu","345","2014-11-07 17:18:34"));
               
                String username = new String(req.getParameter("username"));
                String password = req.getParameter("password");
               
                System.out.println("username=" + username);
                System.out.println("password=" + password);
                if(username != null && !"".equals(username) && password != null && !"".equals(password))
                {
                        for(User user : users)
                        {
                                if(username.equals(user.getUsername()) && password.equals(user.getPassword()))   如果用户名与密码匹配的话
                                {
                                        resp.getOutputStream().write("登录成功!".getBytes());//就给送这个数据给客户端
                                       
                                        flag = true;
                                        break;
                                }
                        }
                       
                        if(!flag)
                        {
                                resp.getOutputStream().write("登录失败!".getBytes());
                        }
                }
        }

        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp)
                        throws ServletException, IOException {
                // TODO Auto-generated method stub
                this.doGet(req, resp);
        }
}

然后在客户单这边的话,就需要与服务端产生链接与交互:
首先是访问互联网的权限:
<uses-permission android:name="android.permission.INTERNET"/
然后在java代码里面写交互的代码:
public static byte[] loadDate(InputStream is) throws Exception
        {    <font color="#2e8b57">//将服务端像客户端发来的输入流里面的数据转化为字节数组的形式</font>
                ByteArrayOutputStream bos = new ByteArrayOutputStream();
                byte[] buffer = new byte;
                int len = -1;
               
                while((len = is.read(buffer)) != -1)
                {
                        bos.write(buffer,0,len);
                }
                is.close();
                bos.close();
                return bos.toByteArray();
        }
首先要说明的是一般的写法有两种:
1.用HttpURLConnection实现:
其关键代码如下:
GET请求:
String path = "http://192.168.0.115:8080/qqServer/loginServlet?username=" +
                                        URLEncoder.encode(username,"utf-8") + "&password="+URLEncoder.encode(password,"utf-8");
                        URL url = new URL(path);
                        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                        conn.setRequestMethod("GET");
                        conn.setConnectTimeout(5000);
                       
                        int code = conn.getResponseCode();
                       
                        if(code == 200)
                        {
                                InputStream is = conn.getInputStream();
                                return new String(loadDate(is),"GBK");
                               
                        }POST请求:

String path="http://192.168.0.115:8080/qqServer/loginServlet";
                        String data = "username=" + URLEncoder.encode(username,"utf-8") +
                                        "&password=" + URLEncoder.encode(password,"utf-8");
                        URL url = new URL(path);
                        HttpURLConnection conn = (HttpURLConnection) url.openConnection();//获取链接的对象
                        conn.setRequestMethod("POST");
                        conn.setConnectTimeout(5000);
                        conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
                        conn.setRequestProperty("Content-Length", data.length()+"");
                        conn.setDoOutput(true);
                        conn.getOutputStream().write(data.getBytes());//获取输出流,将data的参数发出去
                       
                        int code = conn.getResponseCode();//接收返回码
                       
                        if(code == 200)
                        {
                                InputStream is = conn.getInputStream();   //通过链接对象获得输入流
                                return new String(loadDate(is),"GBK");
                        }
2.用HttpClient实现:
GET请求:
String path = "http://192.168.0.115:8080/qqServer/loginServlet?username=" +
                                        URLEncoder.encode(username,"utf-8") + "&password=" + URLEncoder.encode(password,"utf-8");
                        HttpClient client = new DefaultHttpClient();
                        HttpGet httpGet = new HttpGet(path);
                        HttpResponse response = client.execute(httpGet);
                       
                        int code = response.getStatusLine().getStatusCode();
                       
                        if(code == 200)
                        {
                                InputStream is = response.getEntity().getContent();
                                return new String(loadDate(is), "GBK");
                        }POST请求:
String path = "http://192.168.0.115:8080/qqServer/loginServlet";
                        HttpClient client=new DefaultHttpClient();
                        //创建请求路径的HttpGet对象
                        HttpPost httpPost=new HttpPost(path);   
                       
                        //建立一个List集合,集合中的类型为NameVluePair对象
                        List<NameValuePair> list=new ArrayList<NameValuePair>();
                        list.add(new BasicNameValuePair("username",username));
                        list.add(new BasicNameValuePair("password",password));
                        UrlEncodedFormEntity entity=new UrlEncodedFormEntity(list,"utf-8");
                        //设置实体数据
                        httpPost.setEntity(entity);
                        //让HttpClient往服务器发送数据
                        HttpResponse response=client.execute(httpPost);
                        //找到服务返回的状态码 200表示成功
                        int code=response.getStatusLine().getStatusCode();
                        if(code==200)
                        {
                                InputStream is=response.getEntity().getContent();
                                return new String(loadDate(is),"GBK");
                        }还有就是上面的方法可以通过开一个子线程,再接收返回来的数据,再将这个数据以消息的形式传给主线程,
这样的话,主线程就不会容易造成主线程的堵塞问题:
new Thread()
                {
                        public void run()
                        {
                                String data = SendDataUtils.HttpPostSendData(username, password);
                                if(data != null)
                                {
                                        Message msg = Message.obtain();
                                        msg.what = 1;
                                        msg.obj = data;
                                        handler.sendMessage(msg);
                                }
                        }
                }.start();
恩~~ 以上就是普通的实现方法,可是还有一种更加简单的实现方法就是,利用网上的一个开源框架来实现;
这需要在网上下载这个jar文件:android-async-http-1.4.5.jar;值得注意的是这个开源框架是基于阿帕奇服务的!!

其主要实现的代码如下:
GET请求的实现:
String url = "http://192.168.0.115:8080/qqServer/loginServlet?username=" +
                                        URLEncoder.encode(username,"utf-8") + "&password="+URLEncoder.encode(password,"utf-8");
                        AsyncHttpClient client = new AsyncHttpClient();
                        client.get(url, new AsyncHttpResponseHandler() {
                               
                                @Override
                                public void onSuccess(int arg0, Header[] arg1, byte[] arg2) {
                                        // TODO Auto-generated method stub
                                        try
                                        {
                                                Toast.makeText(MainActivity.this, new String(arg2,"GBK"), 0).show();
                                        }catch(Exception e)
                                        {
                                                e.printStackTrace();
                                        }
                                }
                               
                                @Override
                                public void onFailure(int arg0, Header[] arg1, byte[] arg2, Throwable arg3) {
                                        // TODO Auto-generated method stub
                                       
                                }
                        });POST请求的实现:
String url = "http://192.168.0.115:8080/qqServer/loginServlet";
                       
                                username = URLEncoder.encode(username,"utf-8");
                                password = URLEncoder.encode(password,"utf-8");
                                AsyncHttpClient client = new AsyncHttpClient();   //异步http
                                RequestParams params = new RequestParams();   //请求参数
                                params.put("username", username);   //将用户名设置进去
                                params.put("password", password);
                                client.post(url, params,new AsyncHttpResponseHandler() {   //调用post方法
                                       
                                        @Override
                                        public void onSuccess(int arg0, Header[] arg1, byte[] arg2) {   //回调方法
                                                // TODO Auto-generated method stub
                                                try
                                                {
                                                        Toast.makeText(MainActivity.this, new String(arg2,"GBK"), 0).show();
                                                }catch(Exception e)
                                                {
                                                        e.printStackTrace();
                                                }
                                        }
                                       
                                        @Override
                                        public void onFailure(int arg0, Header[] arg1, byte[] arg2, Throwable arg3) {
                                                // TODO Auto-generated method stub
                                               
                                        }
                                });







◎。◎ 发表于 2014-11-8 18:55:11

:loveliness:既然进来了就要留脚印

拈花小仙 发表于 2014-11-8 23:46:38

支持下玄玄~

wangypc 发表于 2015-7-31 11:44:37

请问下那个HTTPCLIENT 的url地址怎么请求的,我用android studio请求整天无法请求过去

ld407553497 发表于 2016-1-30 15:23:57

哇 ,求 服务端教程
页: [1]
查看完整版本: android学习之访问互联网--服务端的登录验证