昨天浏览博客的时候看到一个“博客专家”写了一篇博文,深受启发。
特别感谢这位大神,我已经买了你写的那本书“第一行代码”,会细心阅读的。
我就是通过你这边博文深受启发的,特此链接到这里,希望对大家和我以后的学习有帮助。感谢大神,嘿嘿....
巧用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
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();
}
}
最后记得加入访问网络的权限:
客户端代码也就ok了。测试成功。
学习总结:
必须了解ObjectInputStream,ObjectOutputStream这两个对象流。请参考jdk帮助文档
理解serlvet中的request,response对象的含义:
请求(request),可以获得字节输入流request.getInputStream(),从流中读取客户端请求过来的数据对象。
响应(response),可以获得字节输出流response.getOutputStream(),将服务端的数据对象写入流中。