您的位置:首页 > 编程语言 > Java开发

Java Socket对象数据传输

2012-11-30 15:23 295 查看
前面写了一篇博客,是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();
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: