巧用Android网络通讯技术,在网络上直接传输对象

本文首发于CSDN博客,转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/8967080java

要作一个优秀的Android应用,使用到网络通讯技术是必不可少的,很难想象一款没有网络交互的软件最终能发展得多成功。那么咱们来看一下,通常Android应用程序里都是怎么实现网络交互的,这里拿一个Boook对象为例:android

如上图所示,首先在手机端生成一个Book对象,里面包含书名、做者、价格等数据。为了要将这些数据发送到服务器端,咱们要从Book对象中把数据取出,而后组装成XML格式的字符串。接着经过网络API,把组装好的XML字符串发送到服务器端。服务器端接到了客户端发来的XML字符串,就要对该XML进行解析。而后把解析出的数据从新组装成Book对象,以后服务器端就能够对该对象进行一系列其它的操做了。编程

固然XML格式的数据量比较大,如今不少Android应用为了节省流量,都改用JSON格式来传输数据了。不过无论是使用XML仍是JSON,上图中描述的步骤老是少不了的。服务器

感受使用这种方式来传输数据,每次封装和解析XML的过程是最繁琐的,那么能不能把这最繁琐的过程绕过去呢?网络

如上图所示,若是能够调用网络API,直接把Book对象发送到服务器端,那么整个网络交互过程就会变得很是简单,下面咱们就来看看如何实现。ide

新建一个Android工程,命名为ClientTest做为客户端工程。这里第一个要肯定的就是待传输的对象,咱们新建一个Book类,代码以下:布局

package com.test;

import java.io.Serializable;

public class Book implements Serializable {

    private String bookName;

    private String author;

    private double price;

    private int pages;

    public String getBookName() {
        return bookName;
    }

    public void setBookName(String bookName) {
        this.bookName = bookName;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public double getPrice() {
        return price;
    }

    public void setPrice(double price) {
        this.price = price;
    }

    public int getPages() {
        return pages;
    }

    public void setPages(int pages) {
        this.pages = pages;
    }

}

这个类就是一个简单的POJO,可是要注意一点,它实现了Serializable接口,若是想在网络上传输对象,那么该对象就必定要实现Serializable接口。this

接下来打开或新建activity_main.xml做为程序的主布局文件,加入以下代码:url

<RelativeLayout 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:background="#000"
    tools:context=".MainActivity" >

   <Button 
     android:id="@+id/send"  
     android:layout_width="fill_parent"
     android:layout_height="wrap_content"
     android:text="发送"
     />

</RelativeLayout>

这个布局里面就是包含了一个按钮,点击这个按钮就去发出网络请求。spa

接下来打开或新建MainActivity做为程序的主Activity,其中加入以下代码:

public class MainActivity extends Activity implements OnClickListener {

    private Button send;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        send = (Button) findViewById(R.id.send);
        send.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        Book book = new Book();
        book.setBookName("Android高级编程");
        book.setAuthor("Reto Meier");
        book.setPages(398);
        book.setPrice(59.00);
        URL url = null;
        ObjectOutputStream oos = null;
        try {
            url = new URL("http://192.168.1.103:8080/ServerTest/servlet/TestServlet");
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setDoInput(true);
            connection.setDoOutput(true);
            connection.setConnectTimeout(10000);
            connection.setReadTimeout(10000);
            connection.setRequestMethod("POST");
            oos = new ObjectOutputStream(connection.getOutputStream());
            oos.writeObject(book);
            InputStreamReader read = new InputStreamReader(connection.getInputStream());
            BufferedReader br = new BufferedReader(read);
            String line = "";
            while ((line = br.readLine()) != null) {
                Log.d("TAG", "line is " + line);
            }
            br.close();
            connection.disconnect();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {

        }
    }

}

咱们能够看到,在onClick方法中处理了按扭的点击事件。这里首先new出了一个Book对象做为待传输数据,接着new出了一个URL对象,指明了服务器端的接口地址,而后对HttpURLConnection的一些可选参数进行配置。接着经过调用ObjectOutputStream的writeObject方法,将Book对象发送到服务器端,而后等服务器端返回数据,最后关闭流和链接。

注意因为咱们使用了网络功能,所以须要在AndroidManifest.xml中加入以下权限:

<uses-permission android:name="android.permission.INTERNET" />

好了,目前Android端的代码已经开发完成,咱们如今开始来编写服务器端代码。

新建一个名为ServerTest的Web Project,要作的第一件事就在Web Project下创建一个和Android端同样的Book类。这里有个很是重要的点你们必定要注意,服务器端的Book类和Android端的Book类,包名和类名都必须相同,不然会出现类型转换异常。这里因为两个Book类的内容是彻底同样的,我就再也不重复贴出。

而后新建一个Java Servlet做为网络访问接口,咱们重写它的doPost方法,具体代码以下:

public class TestServlet extends HttpServlet {

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        ObjectInputStream ois = null;
        try {
            ois = new ObjectInputStream(request.getInputStream());
            Book book = (Book) ois.readObject();
            System.out.println("书名是: " + book.getBookName());
            System.out.println("做者是: " + book.getAuthor());
            System.out.println("价格是: " + book.getPrice());
            System.out.println("页数是: " + book.getPages());
            PrintWriter out = response.getWriter();
            out.print("success");
            out.flush();
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            ois.close();
        }
    }
    
}

能够看到,咱们首先经过调用HttpServletRequest的getInputStream方法获取到输入流,而后将这个输入流组装成ObjectInputStream对象。接下来就很简单了,直接调用ObjectInputStream的readObject方法,将网络上传输过来的Book对象获取到,而后打印出Book中携带的数据,最后向客户端返回success。

如今咱们来运行一下程序,首先将ServerTest这个项目布置到服务器上,并开启服务器待命。接着在手机上打开ClientTest这个应用程序,以下图所示:

                            

点击发送发出网络请求,能够看到服务器端打印结果以下:

而Android端打印结果以下:

由此咱们能够看出,网络上进行对象传输已经成功了!不须要经过繁琐的XML封装和解析,咱们也成功将Book中的数据完整地从Android端发送到了服务器端。

好了,今天的讲解到此结束,有疑问的朋友请在下面留言。

源码下载,请点击这里

相关文章
相关标签/搜索