android:使用网络通信技术从客户端直接获取服务端的对象数据

原创 2015年11月18日 21:25:36

昨天浏览博客的时候看到一个“博客专家”写了一篇博文,深受启发。

特别感谢这位大神,我已经买了你写的那本书“第一行代码”,会细心阅读的。


我就是通过你这边博文深受启发的,特此链接到这里,希望对大家和我以后的学习有帮助。感谢大神,嘿嘿....

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

上面这个链接是从服务端读取客户端的数据。


我总结了一下从客户端读取服务端的对象数据。有什么不足之处希望大家提出宝贵意见。


大家都知道,传统的服务端和客户端进行数据交互的时候,以前采用了xml文件格式的方式将数据封装进行传递,随着技术的革新,大家都开始使用了json格式进行数据传递。

以上两个方式无论从怎么优化都需要:服务端(客户端)--->xml格式或者json格式--->客户端(服务端) ,经过这个流程。为什么不能直接将对象从服务端或者客户端传递啊,中间不需要经过任何介质,直到今日(以前我孤陋寡闻了...呜呜呜),看见那位大神的博文,让我深受启发。


下面我简单介绍下从客户端直接读取服务端的数据对象:

先看下运行效果图:


服务端代码:

Student.java

package com.xbmu.bean;
import java.io.Serializable;
public class Student implements Serializable {
	private static final long serialVersionUID = 1L;
	private String username;
	private String nickname;
	private String password;
	public Student() {
	}
	
	public Student(String username, String nickname, String password) {
		this.username = username;
		this.nickname = nickname;
		this.password = password;
	}

	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getNickname() {
		return nickname;
	}
	public void setNickname(String nickname) {
		this.nickname = nickname;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}

	@Override
	public String toString() {
		return "Student [username=" + username + ", nickname=" + nickname
				+ ", password=" + password + "]";
	}
	
}

StudentServlet.java

package com.xbmu.web.controller;

import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.xbmu.bean.Student;

public class StudentServlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		Student stu = new Student("bitaotao", "btt", "123456");//在服务端创建一个对象,也可以从数据库中获取
		OutputStream outStream = response.getOutputStream();
		ObjectOutputStream objOutputStream = new ObjectOutputStream(outStream);
		objOutputStream.writeObject(stu);//将对象写入对象输出流中
		objOutputStream.flush();//刷新流,保证对象存储到流中
		objOutputStream.close();//关闭流
	}

	
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		doGet(request, response);
		
	}

}

服务端代码就完了,启动tomcat,将web应用部署到服务器上,访问:http://10.6.159.37:8080/StudentMsgServer/servlet/StudentServlet

服务端代码成功运行。

客户端代码:

activity_main.xml

<LinearLayout 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:orientation="vertical"
    tools:context=".MainActivity" >

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="getNetData"
        android:text="获取服务器的数据" />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/tv_data"
        android:text="显示服务器数据:" />

</LinearLayout>

MainActivity.java

package com.xbmu;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.TextView;
import com.xbmu.bean.Student;
public class MainActivity extends Activity {

	private TextView tv_data;
	private Handler handler = new Handler(){
		public void handleMessage(Message msg) {
			Object obj = msg.obj;
			System.out.println(obj);
			tv_data.setText(obj.toString());
		};
	};
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		tv_data = (TextView) findViewById(R.id.tv_data);
	}
	public void getNetData(View view){
		new Thread(new Runnable() {
			
			@Override
			public void run() {
				ObjectInputStream ois = null;
				Student stu = null;
				try {
					URL url = new URL("http://10.6.159.37:8080/StudentMsgServer/servlet/StudentServlet");
					HttpURLConnection conn = (HttpURLConnection) url.openConnection();
					conn.setDoInput(true);  
					conn.setDoOutput(true);  
					conn.setConnectTimeout(10000);  
					conn.setReadTimeout(10000);  
					conn.setRequestMethod("POST");  
					ois = new ObjectInputStream(conn.getInputStream());
					stu = (Student) ois.readObject();
				} catch (Exception e) {
					e.printStackTrace();
				} finally{
					Message msg = new Message();
					msg.obj = stu;
					handler.sendMessage(msg);
					if(null != ois){
						try {
							ois.close();
						} catch (IOException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
					}
				}
			}
		}).start();
		
	}

}
最后记得加入访问网络的权限:

<uses-permission android:name="android.permission.INTERNET"/>
客户端代码也就ok了。测试成功。


学习总结:

必须了解ObjectInputStream,ObjectOutputStream这两个对象流。请参考jdk帮助文档

理解serlvet中的request,response对象的含义:

请求(request),可以获得字节输入流request.getInputStream(),从流中读取客户端请求过来的数据对象。

响应(response),可以获得字节输出流response.getOutputStream(),将服务端的数据对象写入流中。


版权声明:本文为博主原创文章,未经博主允许不得转载。

Android中从网络获取数据的方法

在编写Android应用时,有时会需要从Internet上获取数据。 包括获取网页数据和文件数据。 1.获取网络上的网页数据 通过HttpURLConnection对象,从网络中获取网页...
  • shakespeare001
  • shakespeare001
  • 2012年05月31日 13:40
  • 13843

android获取网络数据

  • 2013年08月03日 14:43
  • 58KB
  • 下载

Android-HttpClient连接网络获取数据

大部分Android App都使用HttpURLConnection 和 Apache HTTP Client来发送和接收网络数据(不包括第三方开源项目),这两者都支持HTTPS,流上传和下载,可...
  • u013656135
  • u013656135
  • 2015年11月14日 22:32
  • 1216

Android中网络获取数据的方法

建一个布局: http://schemas.android.com/apk/res/android"               android:layout_width="match_par...
  • huanying68
  • huanying68
  • 2015年01月24日 11:45
  • 1753

Android应用程序窗口(Activity)的窗口对象(Window) 的创建过程分析

每一个Activity组件都有一个关联的ContextImpl对象,同时,它还关联有一个Window对象,用来描述一个具体的应用程序窗口。由此又可知,Activity只不过是一个高度抽象的UI组件,它...
  • linghu_java
  • linghu_java
  • 2015年01月22日 10:36
  • 910

获取表单对象,得三种方法

获取表单对象,得三种方法getElementById(),getElementsByName(), and getElementsByTagName() 和用法 今天碰到了翻页不好用的问题,检查...
  • xiaomageit
  • xiaomageit
  • 2015年09月19日 00:32
  • 1691

android之访问网络获取网页数据并存入数据库

工具:android studio APK:http://fir.im/ksal 使用URLConnection 连接网络获取网页数据,把联网放在异步线程里执行 使用AsyncTask    e...
  • I_do_can
  • I_do_can
  • 2016年01月19日 15:04
  • 2858

Android 联网取数据

Android中,可以通过Socket、Http获取网络数据。我们首先搞清楚它们分别是什么,再看在Android中,它们如何实现。 1、什么是Socket Socket 是传输层上的编程接口。它是...
  • nairuohe
  • nairuohe
  • 2011年10月10日 14:59
  • 4975

Java服务器与客户端的通信中对象流的使用

在使用java对象流的时候,首先要保证通信双方各有一个公用的包,里面的内容相同,注意异常的抛出。 相同的包 package common; public class User implement...
  • wuxiushu
  • wuxiushu
  • 2016年07月22日 11:19
  • 1162

Android开发笔记---service的绑定及如何获得service实例

service的绑定 1.bindService(serviceIntent, this,Context.BIND_AUTO_CREATE );这个函数是用来绑定service的,但是由于监听是这个...
  • liang1232015
  • liang1232015
  • 2015年08月01日 11:50
  • 3442
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android:使用网络通信技术从客户端直接获取服务端的对象数据
举报原因:
原因补充:

(最多只允许输入30个字)