Android通过get,post方式客户端与服务器端交互实例(慕课网笔记)

来自:http://www.imooc.com/learn/304
一个简单的Android客户端和服务器端传送数据的例子,客户端界面如下:
这里写图片描述
输入两个字符串name,age点击register,在服务器端将我们输入的内容打印出来。
1 服务器端
新建一个dynamic web project,工程名字:web,新建一个servlet,名称:MyServlet。重写doGet,doPost方法。

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String name = request.getParameter("name");//接收来自客户端的参数
        String age = request.getParameter("age");

        /*PrintWriter: prints text data to a character stream
        getWriter :Returns a PrintWriter object that can send character text to the client
        */
        PrintWriter outPrintWriter = response.getWriter();
        outPrintWriter.println("these paras will be sent to client: name = "+ name + ", age = " + age);
        System.out.println("MyServlet:name = " + name);
        System.out.println("MyServlet:age = " + age);
    }

服务器端很简单,就这么多。
2 客户端
2.1 新建布局文件register.xml

<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:stretchColumns="1">
   <TableRow>
       <TextView 
           android:id="@+id/tv_name"
           android:layout_height="wrap_content"
           android:text="name"/>
       <EditText 
           android:id="@+id/edit_name"
           android:layout_height="wrap_content"/>"
   </TableRow>
   <TableRow>
       <TextView 
           android:id="@+id/tv_age"
           android:layout_height="wrap_content"
           android:text="age"/>
       <EditText 
           android:id="@+id/edit_age"
           android:layout_height="wrap_content"/>
   </TableRow>  
   <TableRow>
       <Button 
           android:id="@+id/btn_register"
           android:layout_height="wrap_content"
           android:text="register"
           android:layout_span="2"/>
   </TableRow>
</TableLayout>

2.1 新建对应的java类文件RegisterActivity.java

public class RegisterActivity extends Activity {
    private EditText name;
    private EditText age;
    private Button register;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.register);
        name = (EditText) findViewById(R.id.edit_name);
        age = (EditText) findViewById(R.id.edit_age);
        register = (Button) findViewById(R.id.btn_register);
        register.setOnClickListener(new OnClickListener() {
            String url = "http://223.2.45.232:8080/web/MyServlet";//这里写自己电脑的IP
            @Override
            public void onClick(View v) {
                new HttpThread1(url, name.getText().toString(), age.getText().toString()).start();

            }
        });
    }

}

2.2 新建一个HttpThread1.java继承自Thread,将与服务器交互的代码放在这里。我们先使用get的方式访问。

/*
 * 在子线程中执行和服务器的交互操作
 * */
public class HttpThread1 extends Thread {

    private String url;
    private String name;
    private String age;

    public HttpThread1(String url, String name, String age) {       
        this.url = url;
        this.name = name;
        this.age = age;
    }
    private void doGet()//使用get方式给服务器传参数
    {   
        try {
            url = url + "?name=" + name + "&age=" + age;//通过get方式传参数            
            URL httpUrl = new URL(url);
            HttpURLConnection connection = (HttpURLConnection) httpUrl.openConnection();
            connection.setRequestMethod("GET");
            connection.setReadTimeout(5000);
            BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            StringBuffer sb = new StringBuffer();
            String str;
            while ((str = reader.readLine()) != null) {
                sb.append(str);
            }
            Log.d("HttpThread1", sb.toString());//将从服务器接收来的数据打印出来
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    @Override
    public void run() {
        // TODO Auto-generated method stub
        doGet();        
    }

}

运行Android程序,输入参数即可。
2.3 我们使用post的方式访问服务器
在HttpThread1.java中新增一个doPost方法

private void doPost()//使用post方式给服务器传参数
    {       
        try {                       
            URL httpUrl = new URL(url);
            HttpURLConnection connection = (HttpURLConnection) httpUrl.openConnection();
            connection.setReadTimeout(5000);
            connection.setRequestMethod("POST");
            OutputStream outputStream = connection.getOutputStream();
            String content = "name=" + name + "&age=" + age;
            //将我们要发送的string数据转化为字节数组
            outputStream.write(content.getBytes());//得到一个content的字节数组,返回该操作系统默认的编码格式的字节数组
            BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            StringBuffer sb = new StringBuffer();
            String str;
            while ((str = reader.readLine()) != null) {
                sb.append(str);
            }
            Log.d("HttpThread1", sb.toString());
        } catch (MalformedURLException e) {         
            e.printStackTrace();
        } catch (IOException e) {           
            e.printStackTrace();
        }
    }

然后在run方法中调用即可。
3 以上代码无法处理中文,当我们运行客户端程序,传入中文参数时就会出现乱码,这种情况下我们只需要做一下编码转换即可。
3.1 修改MyServlet.java中的doPost方法

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String name = request.getParameter("name");//接收来自客户端的参数
        String age = request.getParameter("age");       
        /*PrintWriter: prints text data to a character stream
        getWriter :Returns a PrintWriter object that can send character text to the client
        */
        response.setContentType("text/html;charset=utf-8");
        PrintWriter outPrintWriter = response.getWriter();
        //outPrintWriter.println("these params will be sent to client: name = "+ name + ", age = " + age);      
        outPrintWriter.println("these params will be sent to client: name = "+ new String(name.getBytes("ISO-8859-1"),"utf-8") + ", age = " + age); //将编码转为utf-8    
        //System.out.println("MyServlet:name = " + name);
        System.out.println("MyServlet:name = " + new String(name.getBytes("ISO-8859-1"),"utf-8"));//将编码转为utf-8
        System.out.println("MyServlet:age = " + age);
    }

3.2 在HttpThread1.java中对doGet()方法中的url做编码转换,即

//如果要传含有中文的name,需要将name转换为utf-8编码
url = url + "?name=" + URLEncoder.encode(name, "utf-8") + "&age=" + age;//通过get方式传参数

3.3 当使用post方式时就无需转换编码了,因为Android系统本身的默认配置中提供了utf-8编码的支持,因此不用修改HttpThread1.java中doPost()方法了。

源码在这里:http://download.csdn.net/detail/hnyzwtf/9382615

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章