java socket传输对象_Java学习笔记——用Socket传送对象

声明:内容是在学习过程中的笔记,纯属自嗨留念,欢迎指正

一、对象的序列化(Serializable)

什么是序列化?序列化是指将对象的状态信息转换为可以存储或传输的形式(2进制数据)的过程。在序列化期间,对象将其当前状态写入到临时或持久性存储区。以后,可以通过从存储区中读取或反序列化对象的状态,重新创建该对象。

序列化就是为了能够传送对象而必须要做的处理

序列化的目的:

1)永久的保存对象,保存对象的字节序列到本地文件中;

2)通过序列化对象在网络中传递对象;

3)通过序列化对象在进程间传递对象。

二、用Socket传送对象的简单例子

"transmitData"传送对象的类的包

public class transmitData implements Serializable{

private static final long serialVersionUID=1L;

int data = 1;

public transmitData(){ }

int getdata(){

return data;

}

}

"package Client"部分代码

import transmitData.*;

***(略)

Socket s = new Socket(ip,port);

OutputStream os = s.getOutputStream();

ObjectOutputStream oos = new ObjectOutputStream(os);

transmitData data = new transmitData();

oos.write(data);

oos.close();

s.close();

"package Sever"部分代码

import transmitData.*;

***(略)

SeverSocket ss(port);

while(true){

Socket s = ss.accept();

InputStream is = s.getInputStream();

ObjectInputStream ois = new ObjectInputStream(is);

transmitData data = (transmitData)ois.readObject();

data.getdata();

}

***

三、遇到的问题及解决对策抛出了java.io.NotserializableException

cannot cast obj1 to obj2 ,obj1 and obj2 are in umnamed module of loader 'app'

问题一:

把你要传输的类序列化一下就可以了(参考transmitData包)

问题二:

如果把要传输的类分别写在client和sever里面,会导致传输的数据无法被读取,client里面的transmitData无法被sever里面的transmitData所读取,就会导致问题二的发生。只要把传送的类写在client和sever包之外的包里就可以了。

参考


版权声明:本文为weixin_39853843原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。