1. socket通信
1.1 服务器与客户端均采用多线程(必须的,因Android UI里面进行网络数据请求的时候,socket不能在主线程);
参考:http://blog.csdn.NET /x605940745/article/details/17001641
1.2 socket可以保持多客户端同时在线,易于维护。 http需轮询。 参考两者的差别:http://blog.csdn.Net /ljp12345/article/details/52120828
1.3 socket传递Object对象时,必须注意,包名必须一致, 另外,必须保证Object全部被序列化!否则易出错,Java .lang.ClassNotFoundException 原因是 客户端和服务端传递的对象所在包的路径不一致
2.Android客户端
2.1 定义Handler, 用于socket子线程回传数据,UI刷新;
2.2 利用Intent,用于两个activity之间的结构化数据传输,Intent.putExtra (String name, Serializable value),务必注意数据要序列化 ; --》参考:http://blog.youkuaiyun.com/codezjx/article/details/8876753,注意在AndroidManifest文件里面,注册activity。
2.3 利用Arraylist<Object>,对数据表的每一行数据,进行存储;
2.4 数据库的显示技术,用到了listView技术;
2.5 数据库查询,直接sqlite包里面的query方法,得到cursor,可进行遍历;
3. 服务器端
3.1 服务端的sqlite,采用的下载包:org.sqlite.JDBC ,可参考http://blog.youkuaiyun.com/ljp12345/article/details/52131631
3.2 对数据库的任何更新操作,均采用了synchronized static 方法,加synchronized是为了给该对象上锁,加static目的是变成静态方法, 同一时间,只能接受一个对象访问该方法,且是静态访问,其他对象也被上锁。
3.3 读取系统时间,并格式化。 //当前时间 Date day=new Date(); SimpleDateFormat df = new SimpleDateFormat("yyyy_MM_dd_HHmmss");
3.4 JDBC数据库的更新时,默认是autoCommit, 为保证安全,可以先禁止掉,用prepareStatement代替createStatement。如:
//1. Obtain connection and set `false` to autoCommit c = DriverManager.getConnection("jdbc:sqlite:"+dbFileName); c.setAutoCommit(false); //2. Prepare and execute statements statement1=c.prepareStatement(sql); //3. Execute the statements statement1.executeUpdate(); //4. Commit the changes c.commit();
以下为示例转载:Socket传输List<Object>数据
在进行Android 程序开发时,有需求将服务器(PC)的数据库数据在android客户端显示,通过网络或Socket进行数据的传输,一般的SOCKET数据传输都是以流媒体进行传输,一把从服务器查询的数据类型经过面向对象的封装成Object,所以,一般都将数据转换成JSON或者XML进行传输,android程序进行解析显示,但也可以通过ObjectInputStream,ObjectOutputStream通过Socket传输,下面为代码:
数据的封装类:Student.java
package Test; import java.io.Serializable; public class Student implements Serializable { private int id; private String name; public int getId() { return id; } public void setId( int id) { this .id = id; } public String getName() { return name; } public void setName(String name) { this .name = name; } @Override public String toString() { return id + "=" + name; } }
还有一个集合类的封装:ListTest.java
package Test; import java.io.Serializable; import java.util.List; public class ListTest implements Serializable { private List<Student> list; public List<Student> getList() { return list; } public void setList(List<Student> list) { this .list = list; } }
下面是简单的Socket传输测试 :
服务端:
package Test; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList; import java.util.List; public class Server extends Thread { private ServerSocket server; private Socket socket; public Server(){ try { server = new ServerSocket( 9000 ); socket = server.accept(); } catch (Exception e) { System.out.println("start error" ); } } @Override public void run() { try { Student stu = new Student(); stu.setId(1 ); stu.setName("name1" ); Student stu1 = new Student(); stu1.setId(1 ); stu1.setName("name2" ); List<Student> list = new ArrayList<Student>(); list.add(stu); list.add(stu1); ListTest test = new ListTest(); test.setList(list); ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream()); out.writeObject(test); out.flush(); out.close(); socket.close(); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { new Server().start(); } }
客户端:
package Test; import java.io.ObjectInputStream; import java.net.Socket; import java.util.List; public class Client { public static void main(String[] args) { try { Socket socket = new Socket( "127.0.0.1" , 9000 ); ObjectInputStream in = new ObjectInputStream(socket.getInputStream()); ListTest test = (ListTest) in.readObject(); List<Student> list = test.getList(); for (Student student : list) { System.out.println(student.getName()); } } catch (Exception e) { e.printStackTrace(); } } }
其中的两个封装类必须实现序列化接口!!!