Java Socket对象数据传输
2012-11-30 15:23
295 查看
前面写了一篇博客,是Java Socket的学习,下面做了一个Java Socket之间的对象数据传输。
单线程的对象传输入:
需要一个对象实体类,且要继承java.io.Serializable,序列化后的对象,才可以通过流的方式传输。
多线程,只是在服务器端启了线程,可以做CPU的线程池,这里没有做。
单线程的对象传输入:
package com.zyujie.socket; 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 ObjectServer { public static void main(String[] arg) throws Exception { //创建服务器端的Socket,并监听端口6688 ServerSocket socketConnection = new ServerSocket(6688); System.out.println("服务器已经开启,等待连接。"); //接收客户端连接,并返回一个socket对象 Socket scoket = socketConnection.accept(); //对象数据的输入与输出,需要用ObjectInputStream和ObjectOutputStream进行 ObjectInputStream in = new ObjectInputStream(scoket.getInputStream()); ObjectOutputStream out = new ObjectOutputStream(scoket.getOutputStream()); //读取客户端的对象数据流 City city = (City) in.readObject(); List cityList = city.getCityList(); for (int i = 0; i < cityList.size(); i++) { System.out.println("服务器端得到城市数据:" + cityList.get(i).toString()); } //返回给客户端的对象 City cityBack = new City(); List list = new ArrayList(); list.add("广州"); list.add("深圳"); cityBack.setCityList(list); out.writeObject(cityBack); out.flush(); in.close(); out.close(); } }
package com.zyujie.socket; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.net.InetAddress; import java.net.Socket; import java.util.ArrayList; import java.util.List; public class ObjectClient { public static void main(String[] arg) throws Exception { //封装一个对象实例 City city = new City(); List list = new ArrayList(); list.add("北京"); list.add("上海"); list.add("天津"); list.add("重庆"); city.setCityList(list); //连接到服务器端 Socket socketConnection = new Socket(InetAddress.getLocalHost(), 6688); //使用ObjectOutputStream和ObjectInputStream进行对象数据传输 ObjectOutputStream out = new ObjectOutputStream(socketConnection.getOutputStream()); ObjectInputStream in = new ObjectInputStream(socketConnection.getInputStream()); //将客户端的对象数据流输出到服务器端去 out.writeObject(city); out.flush(); //读取服务器端返回的对象数据流 City cityBack = (City) in.readObject(); List backList = cityBack.getCityList(); for (int i = 0; i < backList.size(); i++) { System.out.println("客户端得到返回城市数据:" + backList.get(i).toString()); } out.close(); in.close(); } }
需要一个对象实体类,且要继承java.io.Serializable,序列化后的对象,才可以通过流的方式传输。
package com.zyujie.socket; import java.io.Serializable; import java.util.List; public class City implements Serializable { //实体类,特别注意,作为对象数据流传输,需要继承java.io.Serializable,使用对象进行序列化 private List cityList; public List getCityList() { return cityList; } public void setCityList(List cityList) { this.cityList = cityList; } }
多线程,只是在服务器端启了线程,可以做CPU的线程池,这里没有做。
package com.zyujie.socket; 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 ObjectServerApp extends Thread { private Socket client; /* * 构造函数,接收每一个socket实例 */ public ObjectServerApp(Socket socket) { this.client = socket; } /* * 线程执行方法 */ public void run() { try { System.out.println("线程开启"); //对象数据流的获取与返回 ObjectInputStream in = new ObjectInputStream(client.getInputStream()); ObjectOutputStream out = new ObjectOutputStream(client.getOutputStream()); City city = (City) in.readObject(); List cityList = city.getCityList(); for (int i = 0; i < cityList.size(); i++) { System.out.println("服务器端得到城市数据:" + cityList.get(i).toString()); } List list = new ArrayList(); list.add("广州"); list.add("深圳"); City cityBack = new City(); cityBack.setCityList(list); out.writeObject(cityBack); in.close(); out.close(); } catch (Exception e) { } finally { } } /* * 启用线程方法实现多个用户连接socket服务器端. */ public static void main(String[] args) throws IOException { // 创建服务端,监听端口6688 ServerSocket server = new ServerSocket(6688); System.out.println("服务器已经开启,等待连接。"); // 使用服务器端保持永久监听状态 while (true) { // 接收每一个客户端的连接,并返回socket实例 ObjectServerApp osa = new ObjectServerApp(server.accept()); // 为每一个客户端启一个线程,去执行操作 osa.start(); } } }
相关文章推荐
- Struts2 后台数据传输到页面(域对象传值,值栈(狭义值栈和广义值栈))
- springmvc 中ajax传输数据(对象)
- 我们为什么需要DTO(数据传输对象)
- Java Socket实战之三 传输对象
- Java Socket实战之五 使用加密协议传输对象
- Java Socket实战之三 传输对象
- ABP理论学习之数据传输对象(DTO)
- 使用mina2对象传输数据是,传输的数据序列化错误与解决方案
- Java Socket传输数据的文件系统介绍
- 分布式应用架构中的数据传输对象(DTO)
- Java Socket实战之三 传输对象
- 对数据传输对象理解
- Java Socket实战之 传输对象
- DTO--数据传输对象
- 我们为什么需要DTO(数据传输对象)
- Tomcat Servlet 往外传输数据(对象 or list) 给 Android
- Java Socket实战之三 传输对象
- Java Socket实战之四:传输压缩对象
- Java Socket实战之三 传输对象
- Java Socket实战之三 传输对象