Socket数据传输List<E>数据

本文介绍如何在Android应用中通过Socket从服务器接收并显示数据库数据。利用ObjectInputStream和ObjectOutputStream,直接传输实现了序列化接口的对象,如Student类,避免了JSON或XML的额外解析步骤。服务端和客户端的简单Socket通信示例代码包含在内。

在进行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() {
		// TODO Auto-generated method stub
		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());
			//进行Object传输可以使用ObjectInputStream
			ListTest test = (ListTest) in.readObject();
			List<Student> list = test.getList();
			for (Student student : list) {
				System.out.println(student.getName());
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

其中的两个封装类必须实现序列化接口!!!



 

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值