Java Socket对象数据传输

来源:互联网 发布:网络新词语 编辑:程序博客网 时间:2024/04/28 01:15

前面写了一篇博客,是Java Socket的学习,下面做了一个Java Socket之间的对象数据传输。

单线程的对象传输入:

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,并监听端口6688ServerSocket 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 {// 创建服务端,监听端口6688ServerSocket server = new ServerSocket(6688);System.out.println("服务器已经开启,等待连接。");// 使用服务器端保持永久监听状态while (true) {// 接收每一个客户端的连接,并返回socket实例ObjectServerApp osa = new ObjectServerApp(server.accept());// 为每一个客户端启一个线程,去执行操作osa.start();}}}