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

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

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


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

巧用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)