关于socket通信时传输对象

本文讨论了socket编程中传输对象时应注意的事项,包括将类对象放在同名包中进行序列化的重要性,以及ObjectInputStream与ObjectOutputStream的正确使用顺序以避免死锁。详细解释了序列化类的方法,并通过实例演示了如何正确处理对象传输。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

利用socket通信传输对象,主要内容膜拜此大神的文章 http://blog.youkuaiyun.com/kongxx/article/details/7259827


在socket编程中,客户端和服务器端要发送或者接受的类对象  注意要放在包名一样的包中!!!

如Client要发送User对象,可以创建一个User包,把这个User类放在User包中

而服务器也做同样的事,可以创建一个User包,把这个User类放在User包中!!!!

public class User implements Serializable{   //注意要序列化该类
        public String name;
        public int age;
        public User(){
            name="";
            age=0;
        }

1. ObjectInputStream与ObjectOutputStream的顺序问题
在网络通讯中,主机与客户端若使用ObjectInputStream与ObjectOutputStream建立对象通讯,必须注重声明此两个对象的顺序。
如:
主机端先建立ObjectInputStream后建立ObjectOutputStream,则对应地客户端要先建立ObjectOutputStream后建立ObjectInputStream,否则会造成两方互相等待数据而导致死锁。
原因是建立ObjectInputStream对象是需要先接收一定的header数据,接收到这些数据之前会处于阻塞状态。以下为java API文档的说明
Creates an ObjectInputStream that reads from the specified InputStream.
A serialization stream header is read from the stream and verified.
This constrUCtor will block until the corresponding ObjectOutputStream
has written and flushed the header.

故而为了防止这种死锁状态,通讯两方的ObjectInputStraem,ObjectOutputStream必须注重顺序对应使用。



但是一定要注意,把这个User类放在一个User包里,意思是此实体类必须放在同名的包里,不然就会报出 ClassNotFound错误,OMG,折腾我两小时啊,求大神指教下为什么???

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值