求解关于socket编程中的ObjectOutputStream问题

yxyyinxinyu 2012-04-20 10:08:16
大致是这样的:服务器-客户端的群聊程序,用ObjectIOStream来传递数据的时候,服务器上每个线程分管一个客户端,但是一个客户端的消息要转发给所有人就要用到连接了每个人的ObjectOutputStream,会出现【 java.io.StreamCorruptedException: invalid type code: AC异常】这个错误,google了一些资料说是因为ObjectOutputStream有锁,不能在一个线程里new 出多个ObjectOutputStream流,我应该怎么在每个服务器线程中完成消息对所有其他用户的转发呢?

因为本人是java新手,代码太乱了。。就不贴了。。。

【就是服务器上连接着A用户的线程怎么把A发来的消息转发给B,C,D,E,F的问题~~~~】
...全文
305 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
u011643314 2014-07-23
  • 打赏
  • 举报
回复
[quote=引用 2 楼 yxyyinxinyu 的回复:] [Quote=引用 1 楼 的回复:] ObjectInputStream 是对象反序列化反之对象序列化是把对像读到内存里的 [/Quote] 主要是发出的消息不能转发到其他人那里。。。返回自己那里的是可以的[/quote用广播技术
yxyyinxinyu 2012-04-22
  • 打赏
  • 举报
回复
解决了,感谢楼上各位!!!

把所有的ObjectOutputStream扔进一个数组里,每次发送时将当前线程里的outputstream等于数组里的一个,发送,如此遍历数组之后再将outputstream改回来。

yxyyinxinyu 2012-04-22
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

群聊系统也是聊天系统,如果是我的话,我会先把消息发送到服务端,通过服务端转发给各个客户端。
具体:
当客户端向服务端发送Socket连接时,产生一个中间对象,拥有客户端和服务端的InputStream、OutputStream对象,并实现Runnable接口,然后把这个对象保存在服务端List中。
每次通过这个中间对象进行交流,服务端还可以从List中选择消息的发送对象。
[/Quote]
综合你和3楼说的,我貌似明白了。就是把所有线程放进一个集合,另有其他线程来调用这些线程的发送方法。。。是么?
yxyyinxinyu 2012-04-22
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

我也是新手,不对的地方指教
服务器不是每个线程分管一个客户端吗!直接用每个线程里的ObjectOutputStream转发,就不用new新的了,服务器新建线程的时候可以把线程存到MAP里,单聊就可以根据KEY(用户ID)取得相应的线程转发信息,群发的话就用MAP.values()取出全部的线程迭代,一个个转发;
[/Quote]

是啊,但是对于服务器上每个线程,那个线程里面的ObjectIO流两端所联系的只是服务器和那个线程所分管的客户端啊,这个线程没办法在不new出新Output流的情况下把他所管的客户端的消息传达给别人啊。。。可不可以把收到的信息向上汇总给服务器,之后由另一个线程调度所有线程的send方法来分发。。。不过貌似难度很大啊
WJL_MGQS 2012-04-21
  • 打赏
  • 举报
回复
群聊系统也是聊天系统,如果是我的话,我会先把消息发送到服务端,通过服务端转发给各个客户端。
具体:
当客户端向服务端发送Socket连接时,产生一个中间对象,拥有客户端和服务端的InputStream、OutputStream对象,并实现Runnable接口,然后把这个对象保存在服务端List中。
每次通过这个中间对象进行交流,服务端还可以从List中选择消息的发送对象。
shubin520 2012-04-21
  • 打赏
  • 举报
回复
我也是新手,不对的地方指教
服务器不是每个线程分管一个客户端吗!直接用每个线程里的ObjectOutputStream转发,就不用new新的了,服务器新建线程的时候可以把线程存到MAP里,单聊就可以根据KEY(用户ID)取得相应的线程转发信息,群发的话就用MAP.values()取出全部的线程迭代,一个个转发;
yxyyinxinyu 2012-04-20
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

ObjectInputStream 是对象反序列化反之对象序列化是把对像读到内存里的
[/Quote]
主要是发出的消息不能转发到其他人那里。。。返回自己那里的是可以的
爱吃的猫 2012-04-20
  • 打赏
  • 举报
回复
ObjectInputStream 是对象反序列化反之对象序列化是把对像读到内存里的

62,628

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧