Java Socket对象数据传输

前面写了一篇博客,是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,并监听端口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();
		}
	}
}


 

 

  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值