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(),将服务端的数据对象写入流中。


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

相关文章推荐

Mysql 约束(Constraint)

Mysql 约束(Constraint) 约束(Constraint)是Microsoft SQL Server 提供的自动保持数据库完整性的一种方法,定义了可输入表或表的单个列中的数据的限...

约束条件(constraint)

1.为啥使用约束条件: 约束条件也叫完整性约束条件,当对表中的数据做DML操作时会验证数据是否违反约束条件.如果违反了DML操作会失败.约束条件可以应用于表中的一列或几列,应用于整个表或几个表之间....

mybatis之 # 与 $ 区别以及 sql 预编译

mybatis 中使用 sqlMap 进行 sql 查询时,经常需要动态传递参数,例如我们需要根据用户的姓名来筛选用户时,sql 如下:select * from user where name = ...

Mysql 约束(Constraint)

约束(Constraint)是Microsoft SQL Server 提供的自动保持数据库完整性的一种方法,定义了可输入表或表的单个列中的数据的限制条件(有关数据完整性的介绍请参见第9 章)。在SQ...

mysql 约束( key constraints )

mysql支持的key约束只有主键约束(PRIMARY KEY),唯一键值(UNIQUE KEY)约束和外键约束(FOREIGN KEY)。1.唯一键值约束唯一键值索引类型不能是 FULLTEXT 或...

mysql学习-添加删除约束(constraint)的具体操作

这是一次实验的报告内容,具体描述了如何用mysql语句中的alter 给一个已经创建好的表进行添加或删除约束的操作。 1.实验目的  (1)熟悉数据库的约束(constraint) 2.实验内容 1....

android 客户端与服务端的通信 发送get和post请求并获取数据

android 客户端,服务端的相互通信

Android作为客户端,PC作为服务端:实现网络通信

此项目实现网络通信,android手机客户端去请求PC服务端,将PC上mysql中的数据显示在手机上。    PC服务端用JavaWeb写了个servlet,android手机客户端请求这个se...

Android作为客户端,PC作为服务端:实现网络通信

此项目实现网络通信,android手机客户端去请求PC服务端,将PC上mysql中的数据显示在手机上。    PC服务端用JavaWeb写了个servlet,android手机客户端请求这个serv...
  • pzhtpf
  • pzhtpf
  • 2012-06-15 10:33
  • 32932
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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