Android网络通信技术
来源:互联网 发布:网络推广炒作 编辑:程序博客网 时间:2024/05/23 13:19
原文地址:巧用Android网络通信技术,在网络上直接传输对象
首先在手机端生成一个Book对象,里面包含书名、作者、价格等数据。为了要将这些数据发送到服务器端,我们要从Book对象中把数据取出,然后组装成XML格式的字符串。接着通过网络API,把组装好的XML字符串发送到服务器端。服务器端接到了客户端发来的XML字符串,就要对该XML进行解析。然后把解析出的数据重新组装成Book对象,之后服务器端就可以对该对象进行一系列其它的操作了。
当然XML格式的数据量比较大,现在很多Android应用为了节省流量,都改用JSON格式来传输数据了。不过不管是使用XML还是JSON,每次封装和解析的过程是最繁琐的,如果可以直接调用网络API,直接把Book对象发送到服务器端,那么整个网络交互过程就会变得非常简单,下面我们就来看看如何实现。
新建一个Android工程,命名为ClientTest作为客户端工程。这里第一个要确定的就是待传输的对象,我们新建一个Book类,代码如下:
package com.test; import java.io.Serializable; /* * 这个类就是一个简单的POJO, * 但是要注意一点,它实现了Serializable接口, * 如果想在网络上传输对象,那么该对象就一定要实现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; } }接下来打开或新建activity_main.xml作为程序的主布局文件,加入如下代码:
这个布局里面就是包含了一个按钮,点击这个按钮就去发出网络请求。
<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>接下来打开或新建MainActivity作为程序的主Activity,其中加入如下代码:
public class MainActivity extends Activity implements OnClickListener {private Button send;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);send = (Button) findViewById(R.id.send);send.setOnClickListener(this);}@Overridepublic void onClick(View v) {/* * 首先new出了一个Book对象作为待传输数据 * */Book book = new Book();book.setBookName("Android高级编程");book.setAuthor("Reto Meier");book.setPages(398);book.setPrice(59.00);/* * 接着new出了一个URL对象,指明了服务器端的接口地址, * 然后对HttpURLConnection的一些可选参数进行配置。 * */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");/* * 接着通过调用ObjectOutputStream的writeObject方法, * 将Book对象发送到服务器端, * */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 {}}}注意由于我们使用了网络功能,因此需要在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 { /* * 首先通过调用HttpServletRequest的getInputStream方法获取到输入流, * 然后将这个输入流组装成ObjectInputStream对象。 * */ ois = new ObjectInputStream(request.getInputStream()); /* * 接下来直接调用ObjectInputStream的readObject方法, * 将网络上传输过来的Book对象获取到, * 然后打印出Book中携带的数据 * */ 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()); /* * 最后向客户端返回success。 * */ PrintWriter out = response.getWriter(); out.print("success"); out.flush(); out.close(); } catch (Exception e) { e.printStackTrace(); } finally { ois.close(); } } }现在我们来运行一下程序,首先将ServerTest这个项目布置到服务器上,并开启服务器待命。接着在手机上打开ClientTest这个应用程序,如下图所示:
点击发送发出网络请求,可以看到服务器端打印结果如下:
而Android端打印结果如下:
由此我们可以看出,网络上进行对象传输已经成功了!不需要通过繁琐的XML封装和解析,我们也成功将Book中的数据完整地从Android端发送到了服务器端。
- Android网络通信技术
- Android中网络通信技术
- 【Android应用开发技术:网络通信】Android HTTP编程
- 【Android】【笔记】《Android 入门经典》part 13 网络通信技术
- zmq技术--网络通信
- 【Android应用开发技术:网络通信】章节列表
- 【Android应用开发技术:网络通信】网络服务可发现基本原理
- 【Android应用开发技术:网络通信】网络服务可发现使用方法
- 【Android应用开发技术:网络通信】计算机网络基础
- 【Android应用开发技术:网络通信】Socket套接字
- TCP/IP网络通信技术
- Android--通信技术
- 巧用Android网络通信技术,在网络上直接传输对象
- Android网络通信技术(HttpClient),在网络上运用(SerializableEntity)直接传输对象
- 巧用Android网络通信技术,在网络上直接传输对象
- 巧用Android网络通信技术,在网络上直接传输对象
- 巧用Android网络通信技术,在网络上直接传输对象
- 巧用Android网络通信技术,在网络上直接传输对象
- STL中set底层实现方式? 为什么不用hash?
- CentOS Linux VPS服务器配置PPTP上网环境的2个方法
- 多线程(多线程原理)
- 黑马程序员--IO(上)
- 参考51单片机示例程序要注意的一点
- Android网络通信技术
- leetcode :二叉树的前中后序遍历
- uva152
- 杭电oj-1040-As Easy As A+B
- JAVA删除某一目录下的所有文件及文件夹(linnux环境)
- leetcode系列(43)strStr(KMP)
- 堆排序
- 学习算法第一篇:排序算法
- Minimum Path Sum