昨天浏览博客的时候看到一个“博客专家”写了一篇博文,深受启发。
特别感谢这位大神,我已经买了你写的那本书“第一行代码”,会细心阅读的。
我就是通过你这边博文深受启发的,特此链接到这里,希望对大家和我以后的学习有帮助。感谢大神,嘿嘿....
巧用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>
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(),将服务端的数据对象写入流中。