socket用ObjectInputStreame接收服务器端的对象出错

invalidtypeamCorruptedException:invalidtypecode:00服务器端一个一个的发正常,开多个线程发就会出错。服务器端发送时用的同一... invalid typeamCorruptedException: invalid type code: 00
服务器端一个一个的发正常,开多个线程发就会出错。服务器端发送时用的同一个ObjectOutputStream,我在Map中寸了状态,一个线程拿到会标记,别的线程拿时标记过的话会休眠100毫秒重新拿。重置标记是客户端接收到一个数据后返回一个特定对象后重置,但是开多个线程,客户端就会出错。

客户端while(true)循环拿对象。希望遇到过同样问题的帮帮忙
展开
 我来答
jamxval
2014-04-17 · TA获得超过6822个赞
知道大有可为答主
回答量:4308
采纳率:82%
帮助的人:1419万
展开全部
在你这个程序中”客户端“是指一个实体?如果事实上只有一个使用者的话为什么需要多个线程来传送数据?

我觉得你不需要多个线程轮流读取,而是一个线程读取 ObjectInputStream 成功后放入map并说明这个 Object 是给哪个线程使用的。这样一来只有一个线程读取就不存在问题了。要是你打算实现 Object Input/Output Stream 做到“时分多路复用”我觉得不思议,这个我们来细细体会一下。
通信过程中讲的时分多路复用是多个传送方使用一个”线路“传送数据并用任意时刻只有一个哪芹正在使用这个线路,这里面传统的时分多路复用传送的基本单位是字节,一方使用”线路“一次可能传送了一个或多个字节。那么当我们要时分多路复用传送Object时就应该是把传送的基本单位改成对象,也就是一次传递一个或多个对象,你也是想做到这样,但是,”读取一个对象“本身就应该成为像传递一个字节一样成为原子化的操作,并且外部调用不需要(可以或禁止)知道细节。那么这时其实就有两个办法:
1、不让外界知道细节的方法是一个线程负责通信,拿到结果后放入每个 worker 线程的消息传送队列,它们自己去自己的队列中拿数据。细节只是这个通信线程迹态负责,把它包装成一个组件封装起来。
2、如果每个线程也想自己知道负责通信并知道了细节,做标记的办法不是一个好办法,保证原子化操作只有使用线程同步锁,当一个 worker 线程准备通信时需要先拿到锁,然后才拿到了使用通信管道(Socket Input/Output Stream) 的权利,只有当它传送完了一个完整的对象后才释放这个锁,这时李州毕其它 worker 线程再竞选这个锁。用 map 做标记可能产生多个线程同时对一个对象做了标记,要避免它的方法依然是使用同步锁,既然要用到同步锁那就不需要使用 map 做标记而是按前面的同步锁的话来得更简单。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式